该条件何时生效;“无法访问的代码”;发生在Java中?

该条件何时生效;“无法访问的代码”;发生在Java中?,java,unreachable-code,Java,Unreachable Code,当在无限循环之后写入某个语句时,该语句将成为无法访问的代码。例如: for(;;) { } Sytem.out.println("Test-1"); //unreachable code 但我在这里面临一些困难 请看下面的两段代码片段: 代码段1: for(final int z=4;z<6;) { } System.out.println("Test-2"); //unreachable code for(final int z=4;zfor(final int z=4;z z是f

当在无限循环之后写入某个语句时,该语句将成为无法访问的代码。例如:

for(;;) 
{
}
Sytem.out.println("Test-1"); //unreachable code
但我在这里面临一些困难

请看下面的两段代码片段:

代码段1:

for(final int z=4;z<6;)
{
}
System.out.println("Test-2"); //unreachable code
for(final int z=4;z
for(final int z=4;z z是final。它的值不能更改。没有办法跳出这个循环
最终整数z=4;
对于(;;)
{
如果(zFrom

14.21.无法获得的陈述

如果由于以下原因无法执行语句,则为编译时错误 这是遥不可及的

本节专门对这个词进行精确的解释 “可达的。”这个想法是,必须有一些可能的执行 从构造函数、方法、实例开始的路径 初始值设定项,或包含 语句本身。该分析考虑了 声明。while、do和for的特殊处理除外 条件表达式的常量值为true的语句 流量分析中不考虑表达式的值

例如,Java编译器将接受以下代码:

{ int n=5; 而(n>7)k=2;}即使n的值在编译时已知,并且原则上在编译时可以知道 无法执行对k的赋值

本节中的规则定义了两个技术术语:

语句是否可访问

语句是否能正常完成

此处的定义允许语句正常完成,前提是 是可以到达的

为了缩短对规则的描述,通常使用缩写 “iff”用于表示“当且仅当”

一个可到达的break语句退出一个语句,如果 目标,或者没有其try块包含的try语句 break语句,或者有try语句的try块 包含break语句和那些try的所有finally子句 语句可以正常完成

这一定义基于“试图转移”的逻辑 第14.15条中的“控制”

continue语句继续do语句,如果 语句,或者没有其try块包含的try语句 continue语句,或者有try语句的try块 包含continue语句和那些try的所有finally子句 语句可以正常完成

规则如下:

作为构造函数、方法、实例主体的块 可以访问初始值设定项或静态初始值设定项

非开关块的空块可以正常完成 是可以到达的

非开关块的非空块可以正常完成 其中的最后一条语句可以正常完成

非空块(非开关块)中的第一条语句为 当该块可到达时可到达

非空块中的每一条语句都不是开关 当S前面的语句可以完成时,块是可到达的 通常

本地类声明语句可以正常完成 可达的

局部变量声明语句可以正常完成 可达的

如果可以访问空语句,则它可以正常完成

如果至少有一个 事实如下:

包含的语句可以正常完成

有一个可到达的break语句退出标记语句

如果标记的语句是可访问的,则可访问包含的语句 可达的

如果表达式语句是可访问的,则它可以正常完成

if-then语句在可到达时可以正常完成

当if-then语句为 可达的

if-then-else语句可以正常完成if-then语句 可以正常完成,或者else语句可以正常完成

当if-then-else语句为 可达的

当if-then-else语句为 可达的

if语句的这种处理,无论它是否有else部分, 这很不寻常。本节末尾给出了基本原理

如果可以访问assert语句,则它可以正常完成

switch语句可以在至少一个 事实如下:

开关块为空或仅包含开关标签

开关块中的最后一条语句可以正常完成

最后一个开关块后至少有一个开关标签 声明组

开关块不包含默认标签

有一个可到达的break语句退出switch语句

当开关块的开关语句是可到达的时,开关块是可到达的

开关块中的语句在其开关语句为 可访问,且至少以下一项为真:

它带有大小写或默认标签

在开关块的前面有一条语句 前面的语句可以正常完成

while语句通常可以在至少一个 事实如下:

while语句是可访问的,并且条件表达式不是 值为真的常量表达式(§15.28)

有一个可到达的break语句退出while语句

当while语句为 可到达且条件表达式不是常量表达式 其值为假

A
final int z=4;
for(;;)
{
    if(z<2)
        break;
}
System.out.println("Test-3");  //not unreachable
for(final int z=4;z<6;)
{
}
System.out.println("Test-2"); //unreachable code --> z is final. Its value can't change. There is no way out of that loop



final int z=4;
for(;;)
{
  if(z<2)  // z is 4  . The compiler only knows the value of "z". It doesn't know what z<2 evaluates to.. So, it still thinks taht there is a chance of getting out of that loop.
break;
}
System.out.println("Test-3");  //So --> reachable code.
final int x = 0;
if(x == 1) {
    System.out.println("This never happens");
}