最后使用return时无法访问的语句?

abs*_*son 1 java

这编译:

class Ex1 {
    public int show() {
        try {
            int a=10/10;
            return 10;
        }   
        catch(ArithmeticException e) {
            System.out.println(e);
        }
        finally {
            System.out.println("Finally");
        }
        System.out.println("hello");
        return 20;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,这不是:

class Ex15 {
    public int show() {
        try {
            int a=10/0;
            return 10;
        }
        catch(ArithmeticException e) {
            System.out.println(e);
        }
        finally {
            System.out.println("Finally");
            return 40;
        }

        System.out.println("hello");
        return 20;
    }
}
Run Code Online (Sandbox Code Playgroud)

并给出无法访问的语句System.out.println("hello"); 错误.为什么会这样?

Tay*_*ese 7

最后有一个返回,所以你可能会得到一个无法访问的代码块错误.

finally
{   
    System.out.println("Finally"); 
    return 40;
}
System.out.println("hello"); // unreachable code
return 20;
Run Code Online (Sandbox Code Playgroud)

这实际上是Java中的编译时错误.见14.20节.

如果由于无法访问语句而无法执行语句,则会发生编译时错误.

  • @Abson - 每个执行路径都会使它到finally并返回.打印"hello"的代码无法执行.Java将此视为编译器错误.第一个示例工作正常,因为finally块中没有返回. (3认同)

Enn*_*oji 7

是的unreachable code.根据编译器,System.out.println("hello");永远不能执行.

除此之外,不要return在一个finally块内写.(请参阅Java的隐藏功能,了解为什么不应该这样做).

编辑:

是的,但是什么让回报终于做到了?

这不是因为它处于最后一块或其他东西中.即使你删除了finally关键字,你仍然会收到错误.

   class ex15 {
        public int show() {
            int a = 10 / 0;
            return 40;
            System.out.println("hello");
            return 20;
        }
    }
Run Code Online (Sandbox Code Playgroud)

显然,如果你return 40,你无法执行下一行.finally只是意味着"永远做,无论如何".所以.