Finally 块中 return 语句的不可访问语句
Unrechable Statement if return Statement in Finally Block
public class UnrechableCode {
public static void main (String args[])
{
UnrechableCode uc=new UnrechableCode();
try
{
System.out.println(1/0);
}
catch(Exception e)
{
System.out.print("Inside Catch");
return ;
}
finally
{
System.out.println("Inside Finally");
//return;
}
System.out.println("TEST");
}
}
在上面的代码中,当从 Catch 中删除 return 语句时,finally 块之后的语句不会被执行,但它可以被解析器访问。
在相同的情况下,如果我在 finally 块中写 return 相同的语句无法被解析器访问,那么如果在前面的 case 语句中解析器可以访问为什么语句不执行。?
Java 编译器只有有限的能力来预测是否
程序中的特定代码行永远无法到达。
这个事实并不是 Java 的设计者的错;这是一个事实
不可能预测所有可能程序的行为
如此完全的通用语言。
Java 的设计者可以做出的唯一选择是如何限制
编译器的这个能力应该是。
见Why does Java have an "unreachable statement" compiler error?
为了讨论为什么编译器有这种能力,
为什么它认为 "unreachable code" 是一个错误,
以及为什么有些东西可以(相对容易地)被检测为
"unreachable code" 不被认为是 "unreachable code" 错误
由编译器。
在你的特殊情况下,1/0
总是会抛出一个
异常,加上在 catch
块中有一个 return
捕获异常的事实,将阻止程序的任何执行
从曾经将 "TEST" 写入输出。
但是 Java 编译器不会尝试考虑抛出的异常
当它寻找无法访问的代码时,诸如 1/0
之类的东西。
因此,它的行为就好像有一个可能的控制路径被执行
try
块,没有抛出异常(所以没有执行任何代码
在 catch
块中),然后执行 finally
块,然后是 finally
块之后的代码。
编译器的其中一件事
考虑的是 finally
块将
总是在它后面的代码之前执行,如果有
finally
块中的return
,return
之后的代码
根本不会执行。
因此 finally
块中的 return
将使代码
在无法访问之后。
TL;DR: 在一种情况下,"TEST" 语句无法访问,原因如下
Java 编译器旨在识别;在另一种情况下,"TEST" 语句无法访问,原因是 Java 编译器 不是 旨在识别的原因。
public class UnrechableCode {
public static void main (String args[])
{
UnrechableCode uc=new UnrechableCode();
try
{
System.out.println(1/0);
}
catch(Exception e)
{
System.out.print("Inside Catch");
return ;
}
finally
{
System.out.println("Inside Finally");
//return;
}
System.out.println("TEST");
}
}
在上面的代码中,当从 Catch 中删除 return 语句时,finally 块之后的语句不会被执行,但它可以被解析器访问。 在相同的情况下,如果我在 finally 块中写 return 相同的语句无法被解析器访问,那么如果在前面的 case 语句中解析器可以访问为什么语句不执行。?
Java 编译器只有有限的能力来预测是否 程序中的特定代码行永远无法到达。 这个事实并不是 Java 的设计者的错;这是一个事实 不可能预测所有可能程序的行为 如此完全的通用语言。 Java 的设计者可以做出的唯一选择是如何限制 编译器的这个能力应该是。
见Why does Java have an "unreachable statement" compiler error? 为了讨论为什么编译器有这种能力, 为什么它认为 "unreachable code" 是一个错误, 以及为什么有些东西可以(相对容易地)被检测为 "unreachable code" 不被认为是 "unreachable code" 错误 由编译器。
在你的特殊情况下,1/0
总是会抛出一个
异常,加上在 catch
块中有一个 return
捕获异常的事实,将阻止程序的任何执行
从曾经将 "TEST" 写入输出。
但是 Java 编译器不会尝试考虑抛出的异常
当它寻找无法访问的代码时,诸如 1/0
之类的东西。
因此,它的行为就好像有一个可能的控制路径被执行
try
块,没有抛出异常(所以没有执行任何代码
在 catch
块中),然后执行 finally
块,然后是 finally
块之后的代码。
编译器的其中一件事
考虑的是 finally
块将
总是在它后面的代码之前执行,如果有
finally
块中的return
,return
之后的代码
根本不会执行。
因此 finally
块中的 return
将使代码
在无法访问之后。
TL;DR: 在一种情况下,"TEST" 语句无法访问,原因如下 Java 编译器旨在识别;在另一种情况下,"TEST" 语句无法访问,原因是 Java 编译器 不是 旨在识别的原因。