免责声明:我无法访问java编译器,也无法安装IDE,我的工作区没有给予足够的权限。
我试图了解Java如何处理异常并偶然发现了这个问题:
如果一个子类在捕获所有异常的catch块中显式抛出异常,它是否被抛出?例如,请考虑以下代码行:
public Class someClass {
public int value;
public someClass() {
value = 1;
try {
value ++;
if(value == 2) {
throw new Exception("value is 2");
}
} catch (exception e) {
System.out.println("I caught an exception.");
throw new Exception("Does this exception get thrown upwards?");
System.out.println("will this line of code get printed after the previously thrown exception?");
} finally {
return;
}
}
}
public class anotherClass {
public static void main throws Exception{
someClass someclass = new someClass(); // will this class catch the second explicitly thrown exception?
}
}
因此,在try块中抛出一个新的异常,由以下catch块捕获。第二次抛出声明在哪里?如果有的话,它是否会进入调用类?此外,即使抛出异常不在finally块中,println语句是否会在抛出异常后执行?
感谢。
答案 0 :(得分:1)
第二次抛出声明在哪里?它是否向上进入 如果有一个调用类?
是的,将向调用者方法抛出异常,在您的情况下,它是main()
方法。
抛出异常后是否会执行println语句 即使它不在finally块中?
是的,System.out.println("I caught an exception.")
将被执行,然后Exception对象将被抛给调用者(即main()
),因此在catch块中,下面的行无法访问。
System.out.println("will this line of code get
printed after the previously thrown exception?");
重要的一点是,您始终可以使用exception.printStackTrace()
(在catch
块内)来检查方法堆栈中异常的传播方式。我建议您尝试这样做,这样您就可以清楚地看到异常如何在方法中传播。
我建议您参考here并清楚地了解方法链是如何执行的。
另外,您可能感兴趣的另一点是,当main()
方法抛出异常时(即,main()
本身或通过链,无论是什么情况),然后< strong> JVM捕获异常并关闭。
答案 1 :(得分:1)
虽然可能没有意图,但在特定情况下不会抛出异常,您也可以通过throws
的构造函数中缺少的someClass
子句看到该异常。
原因是return
块中的finally
语句,导致java丢弃异常(和一个好的IDE给你一个&#34; finally块没有正常完成&#34;警告)。
更具体地说,section 14.20.2 of the specification表示:
如果catch块因为R而突然完成,那么最后 块被执行。然后有一个选择:
如果finally块正常完成,则try语句突然完成,原因为R。
如果finally块因为S而突然完成,那么try语句突然完成原因S(并且原因R被丢弃)。
原因S 是return
语句而原因R 是throw new Exception("Does this exception get thrown upwards?");
。
您可以看到自己on ideone.com:
class someClass {
public int value;
public someClass() {
value = 1;
try {
value++;
if (value == 2) {
throw new Exception("value is 2");
}
} catch (Exception e) {
System.out.println("I caught an exception.");
throw new Exception("Does this exception get thrown upwards?");
} finally {
return;
}
}
}
class anotherClass {
public static void main(String[] args) {
try {
someClass someclass = new someClass();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
I caught an exception.
但是就这个问题而言,javaguy的回答已经足够涵盖了这一点。