class Foo{
public static void main(String args[]){
final int x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
Run Code Online (Sandbox Code Playgroud)
Java编译器理解if语句的条件始终为true,因此将始终初始化y.没有编译错误,如预期的那样.
class Bar{
public static void main(String args[]){
final int x;
x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我将x的声明和初始化分成两行时,编译器似乎并不认为条件总是为真,并且y将始终被初始化.
final int x;
x=101;
byte b;
b=x;
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
这里发生了同样的事情,编译器会丢失精度错误.
final int x=101;
byte b;
b=x;
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
同样,编译器可以理解x在b的范围内.
我该如何理解这个Java编译器的行为?
while (true) return;
System.out.println("I love Java");
// Err: unreachable statement
if (true) return;
System.out.println("I hate Java");
// OK.
Run Code Online (Sandbox Code Playgroud)
谢谢.
编辑:
几分钟后我发现了这一点:
在第一种情况下,编译器因无限循环而抛出错误.在这两种情况下,编译器都不会考虑语句内部的代码.
编辑二:
让我对javac印象深刻的是:
if (true) return; // Correct
}
while (true) return; // Correct
}
Run Code Online (Sandbox Code Playgroud)
看起来javac知道两个循环内部是什么,如果结果,但是当你编写另一个命令时(如第一个例子中),你得到非等效行为(看起来像javac忘记了循环内部/ if).
公共静态最终EDIT III:
作为此答案我可以此话(希望正确)的结果:作为表达if (arg) { ...; return;}和while (arg) { ...; return;}对Java是等效的两个语义和语法(在字节码)当且仅当argv是不恒定的(或有效最终型)的表达.如果argv是常量表达式字节码(和行为)可能不同.
免责声明
这个问题不是关于无法访问的语句,而是对逻辑等效表达式的不同处理,例如while true return和if true return.
这是我的代码,我得到一个无法访问的语句错误,但我不知道为什么.
public boolean Boardload(String[] args) throws Exception
{
Robot robot = new Robot();
Color color3 = new Color(114, 46, 33);
Color color4 = new Color(180, 0, 0);
{
Rectangle rectangle = new Rectangle(0, 0, 1365, 770);
{
while(false)
{
BufferedImage image = robot.createScreenCapture(rectangle);
search: for(int x = 0; x < rectangle.getWidth(); x++)
{
for(int y = 0; y < rectangle.getHeight(); y++)
{
if(image.getRGB(x, y) == color3.getRGB())
{
return true;
}
}
}
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
确切的错误是:
java:68: …Run Code Online (Sandbox Code Playgroud)