我有一个问题,我自己有一个非常直观的答案。这个问题与Java中的try-catch-finally块有关。好吧就在前几天我尝试了一些东西而且我遇到了这个编译错误。我也经历了Do you really need the 'finally' block,这回答了很多我的怀疑(特别是评论#2)。
我在这里寻找的是为什么当我评论从#11到#13的行时,我会看到编译错误(基本上我正在评论内部catch块)。当取消注释相同的行时,编译和运行时执行运行正常。如果我能从OOPS环境中得到更多答案,那么这将增加我的知识和能力。会有很大的帮助。
提前致谢。 !!
public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try {
System.out.println("Try...");
throw new Exception();
} catch (Exception e) {
System.out.println("Catch...");
try {
System.out.println("Inner Try");
throw new Exception();
} /*catch(Exception e1) {//Line #11
System.out.println("Inner catch");
}*///Line #13
finally{
System.out.println("Inner finally");
}
System.out.println("Going out of catch..");//Line #17
}
finally{
System.out.println("Finally");
}
System.out.println("Going out of try..");//Line #22
}}
答案 0 :(得分:2)
正如其他人所观察到的,你在第10行抛出Exception
。之后会发生什么?
当第11-13行的内部catch
块被取消注释时,您将在第10行抛出Exception
并立即捕获它。你打印出"内部捕获",因为那是catch
块中的内容,然后是"内部最终"。自从您抓住它以来,该异常不再处于活动状态,因此您将继续执行第17行及更高版本。
当移除内部catch
块时,您将在第10行抛出Exception
并直接转到第14行的finally
块。但异常没有&# 39;被抓住了,所以它仍然活跃。退出内部finally
时,没有其他catch
块,因此您的方法将立即返回并将异常传递给调用链。 (在这种情况下,这并不是很远,因为它是main
方法。)重点是第17行上的println
永远无法执行因为例外。
Java编译器非常聪明,可以确定在执行第17行的程序中没有可能的执行路径,因此它会为您提供编译错误(对于第22行也是如此)。
如果您在finally
阻止之后不需要做任何事情,那么您不需要内部捕获。如果您希望保持方法存活并在finally
块之后执行某些操作,则需要保留内部catch
。
答案 1 :(得分:0)
内部try的最后一行抛出异常,这意味着只会执行finally块。
添加另一个catch块,或者删除异常抛出,问题就解决了。
public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try {
System.out.println("Try...");
throw new Exception();
} catch (Exception e) {
System.out.println("Catch...");
try {
System.out.println("Inner Try");
throw new Exception();
} catch(Exception e1) {//Line #11
System.out.println("Inner catch");
}//Line #13
finally{
System.out.println("Inner finally");
}
System.out.println("Going out of catch..");//Line #17
}
finally{
System.out.println("Finally");
}
System.out.println("Going out of try..");//Line #22
}}
或者
public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try {
System.out.println("Try...");
throw new Exception();
} catch (Exception e) {
System.out.println("Catch...");
try {
System.out.println("Inner Try");
// throw new Exception();
} /*catch(Exception e1) {//Line #11
System.out.println("Inner catch");
}*///Line #13
finally{
System.out.println("Inner finally");
}
System.out.println("Going out of catch..");//Line #17
}
finally{
System.out.println("Finally");
}
System.out.println("Going out of try..");//Line #22
}}
会奏效。
答案 2 :(得分:0)
在第10行,您正在抛出需要处理的异常。 由于您没有处理该异常,因此jvm无法在第10行之后编译代码。那就是为什么jvm会给出错误“无法访问的代码”。 所以解决方案是通过捕获该异常来处理该异常 或者不要在第10行抛出异常。