该条件何时生效;“无法访问的代码”;发生在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;zfor(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");
}