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 1
或catch block 2
捕获的是RuntimeException(未经检查的异常)或InterruptedException(检查的异常)。
但是,生成的任何未经检查的异常(编译器无法预测)都将被catch block 1
捕获。结果,catch block 3
永远不会执行。
此外,由于out.println("main ends");
块中的return
语句,行outer try
也从未执行过。
我的解释是错误的,因为该程序已成功编译。
有人可以告诉我catch block 1
或行out.println("main ends");
何时执行吗?
答案 0 :(得分:2)
NullPointerException
是RuntimeException
的子级。因此,所有“内部尝试”块均以返回结尾。
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");
^