为什么它不可达?

时间:2019-11-25 04:01:50

标签: java exception unreachable-code

import java.util.Scanner;
import static java.lang.System.out;

public class practice
{
    public static void main(String args[])
    {
        Scanner sc=new Scanner(System.in);
        int x=sc.nextInt();

        try //outer try
        {
            try //inner try
            {
                if(x==1)
                    throw new NullPointerException();
                else if(x==2)
                    throw new InterruptedException();
                else
                    throw new RuntimeException();
            }
            catch(RuntimeException e) //catch block 1
            {
                out.println("RuntimeException caught!");
            }
            catch(InterruptedException e) //catch block 2
            {
                out.println("InterruptedException caught!");
            }
            out.println("inner try ends");
            return;
        }
        catch(Exception e) //catch block 3
        {
            out.println("Exception caught!");
        }
        finally
        {
            out.println("from finally");
        }

        out.println("main ends"); //unreachable code?
    }
}

在上面的代码中,总是从内部try块抛出一个异常。 由catch block 1catch block 2捕获的是RuntimeException(未经检查的异常)或InterruptedException(检查的异常)。

但是,生成的任何未经检查的异常(编译器无法预测)都将被catch block 1捕获。结果,catch block 3永远不会执行。

此外,由于out.println("main ends");块中的return语句,行outer try也从未执行过。

我的解释是错误的,因为该程序已成功编译。

有人可以告诉我catch block 1或行out.println("main ends");何时执行吗?

1 个答案:

答案 0 :(得分:2)

NullPointerExceptionRuntimeException的子级。因此,所有“内部尝试”块均以返回结尾。

     out.println("inner try ends");
---> return;

所有的finally块都按照docs的说明执行:

  

try块退出时,finally块总是执行。

在这种情况下,return结束“外部尝试”,并最终执行。

如果您简化代码,则会注意到最后的打印内容无法访问:

public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    int x = sc.nextInt();

    try {
        try {
            if (x == 1) {
                throw new NullPointerException();
            }
        } catch (NullPointerException e) {

        }

        return;
    } finally {
        out.println("from finally");
    }

    out.println("main ends");
}
Main.java:24: error: unreachable statement
    out.println("main ends");
    ^