java 中的内部捕获异常
Exception in inner catch in java
在下面的代码中,异常是在内部 catch 块内引发的,因此理想情况下它应该被外部 catch 块捕获并且应该导致正常执行。
但是当我执行时,它没有被捕获到外部catch块中,仍然正常执行,没有任何堆栈跟踪。
我的疑问是,如果它正常执行(没有堆栈跟踪)那么它一定是被外部 catch 捕获了(应该打印了“10”)
代码:
public class Test2 {
public static void main(String[] args) {
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
try {
System.out.println("4");
System.out.println("5");
System.out.println("6");
}
catch(NullPointerException e)
{
int x=1/0;
}
finally
{
System.out.println("8");
}
System.out.println("9");
}
catch(ArithmeticException e)
{
System.out.println("10");
}
finally
{
System.out.println("11");
}
System.out.println("12");
}
}
输出:
1
2
3
4
5
6
8
9
11
12
NullPointerException
不会在您的代码中的任何地方抛出。结果,执行永远不会到达被零除的 catch 块,因此也不会引发算术异常。
尝试在 System.out.println("6");
之后添加如下内容:
Object obj = null;
obj.toString();
使 NullPointerException
被抛出。
您的代码稍作改动:
public class Test2 {
public static void main(String[] args) {
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
try {
System.out.println("4");
System.out.println("5");
System.out.println("6");
} catch (NullPointerException e) {
System.out.println("Inner Catch Block");
int x = 1 / 0;
} finally {
System.out.println("8");
}
System.out.println("9");
} catch (ArithmeticException e) {
System.out.println("10");
} finally {
System.out.println("11");
}
System.out.println("12");
}
}
由于内部try块没有发生异常,内部catch块没有执行。看到Inner Catch Block
没有打印出来。 finally
块已执行,内部 try 块的其余代码已执行。同样,由于外层的try块没有发生异常,外层的catch块也没有执行。
唯一会抛出异常的行是在初始化 x 时。
如果您试图看到此异常,则必须将其移至 try 块之一。它还会抛出 ArithmeticException 而不是 NullPointerException,因此您必须将 catch 块更改为 ArithmeticException 或一般异常。示例如下。
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
try {
int x = 1 / 0;
} catch (ArithmeticException e) {
System.out.println("4");
System.out.println("5");
System.out.println("6");
} finally {
System.out.println("8");
}
System.out.println("9");
} catch (ArithmeticException e) {
System.out.println("10");
} finally {
System.out.println("11");
}
System.out.println("12");
}
在下面的代码中,异常是在内部 catch 块内引发的,因此理想情况下它应该被外部 catch 块捕获并且应该导致正常执行。 但是当我执行时,它没有被捕获到外部catch块中,仍然正常执行,没有任何堆栈跟踪。
我的疑问是,如果它正常执行(没有堆栈跟踪)那么它一定是被外部 catch 捕获了(应该打印了“10”)
代码:
public class Test2 {
public static void main(String[] args) {
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
try {
System.out.println("4");
System.out.println("5");
System.out.println("6");
}
catch(NullPointerException e)
{
int x=1/0;
}
finally
{
System.out.println("8");
}
System.out.println("9");
}
catch(ArithmeticException e)
{
System.out.println("10");
}
finally
{
System.out.println("11");
}
System.out.println("12");
}
}
输出:
1
2
3
4
5
6
8
9
11
12
NullPointerException
不会在您的代码中的任何地方抛出。结果,执行永远不会到达被零除的 catch 块,因此也不会引发算术异常。
尝试在 System.out.println("6");
之后添加如下内容:
Object obj = null;
obj.toString();
使 NullPointerException
被抛出。
您的代码稍作改动:
public class Test2 {
public static void main(String[] args) {
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
try {
System.out.println("4");
System.out.println("5");
System.out.println("6");
} catch (NullPointerException e) {
System.out.println("Inner Catch Block");
int x = 1 / 0;
} finally {
System.out.println("8");
}
System.out.println("9");
} catch (ArithmeticException e) {
System.out.println("10");
} finally {
System.out.println("11");
}
System.out.println("12");
}
}
由于内部try块没有发生异常,内部catch块没有执行。看到Inner Catch Block
没有打印出来。 finally
块已执行,内部 try 块的其余代码已执行。同样,由于外层的try块没有发生异常,外层的catch块也没有执行。
唯一会抛出异常的行是在初始化 x 时。 如果您试图看到此异常,则必须将其移至 try 块之一。它还会抛出 ArithmeticException 而不是 NullPointerException,因此您必须将 catch 块更改为 ArithmeticException 或一般异常。示例如下。
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
try {
int x = 1 / 0;
} catch (ArithmeticException e) {
System.out.println("4");
System.out.println("5");
System.out.println("6");
} finally {
System.out.println("8");
}
System.out.println("9");
} catch (ArithmeticException e) {
System.out.println("10");
} finally {
System.out.println("11");
}
System.out.println("12");
}