在包含return的try / catch块之后执行语句

时间:2014-05-27 14:51:02

标签: java return try-catch try-catch-finally

有三种情况需要考虑:

案例1:

public class Test {

    public static void main(String[] args) {
                System.out.println(1);
                System.out.println(2);
                return;
                System.out.println(3);
    }
}

案例2:

public class Test {

    public static void main(String[] args) {

        try{
            System.out.println(1);
            return;
        }finally{
            System.out.println(2);
        }
        System.out.println(3);
    }
}

案例3:

public class Test {

    public static void main(String[] args) {
        try{
            System.out.println(1);
            return;
        }catch(Exception e){
            System.out.println(2);
        }
        System.out.println(3);
    }
}

据我所知,如果1语句System.out.println(3)无法访问,那就是编译错误的原因,但为什么编译器在第3种情况下没有显示任何错误。

另请注意,在案例2中它甚至是编译器错误。

4 个答案:

答案 0 :(得分:5)

案例3:

如果引发异常,则所有代码都可用,并打印1,2,3。这就是为什么你没有任何错误(无法访问的代码)的原因。

案例2:

在这种情况下,无论你不会到达System.out.println(3),因为你总是从main方法返回。

答案 1 :(得分:3)

在案例2中,您有一个finally子句。它在try子句之后执行。所以执行顺序是:

  1. 的System.out.println(1);
  2. 返回;
  3. 的System.out.println(2);
  4. 和“System.out.println(3);”无法到达。

    但是在案例3中你有一个cath子句。如果try子句中有Exeption,则执行它。 所以有可能的方法(有或没有错误的“System.out.println(1);”)

    首先没有错误:

    1. 的System.out.println(1);
    2. 返回;
    3. 第二个错误:

      1. 的System.out.println(1); (抛出一个执行)
      2. 的System.out.println(2); (不通过返回退出代码或抛出新的代码)
      3. 的System.out.println(3); (在try / catch之后)
      4. PS:如果您在System.out.println(1)上有异常,则在案例2中;他会运行System.out.println(2);就在继续将异常抛到堆栈跟踪之前......

答案 2 :(得分:1)

在情况3中,如果println(1)抛出RuntimeException,则执行println(2),然后执行println(3)。因此,println(3)是可以访问的。

答案 3 :(得分:1)

在您的情况下1您有无法访问的代码,因为无论发生什么情况,您都将从该方法返回 但在案例3中,如果发生异常,您可以执行语句System.out.println(3)

案例3:

如果要在System.out.println(1)中获得异常,那么最终控制将转移到catch块并执行System.out.println(2)然后使用正常流程执行System.out .println(3)

现在是第二种情况:

如果你在try块中没有得到任何异常,它将执行System.out.println(1) 然后是System.out.println(3)

我认为不需要在try块内部返回,因为你必须在println(1)之后编写代码,这应该在println(1)中没有异常时执行

如此好的做法是编写代码如下

public class Test {

    public static void main(String[] args) {
        try{
            System.out.println(1);
            System.out.println(3);
        }catch(Exception e){
            System.out.println(2);
        }
    }
}

那么究竟是什么意思是依赖于System.out.println(1)的执行的语句也应该在System.out.println(1)之后的内部尝试和依赖于代码内部的语句尝试应该写在try-catch外面