最终在Java中阻塞后语句的编译错误

时间:2015-10-29 11:54:32

标签: java

我有一个问题,我自己有一个非常直观的答案。这个问题与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
}}

3 个答案:

答案 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行抛出异常。