Java中"if"的奇怪案例

Vin*_*nic 20 java if-statement

在做某事的时候,我偶然发现了这段代码:

if(true) {
    String message = "Assignment possible";
}

if(true)
    String message = "Time to leave earth";  // error!
Run Code Online (Sandbox Code Playgroud)

为什么在第二种情况下可以在没有括号的情况下在java中写入"if"条件时出现编译错误?

错误消息似乎没有给出正确的信息:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Syntax error, insert ":: IdentifierOrNew" to complete ReferenceExpression
Syntax error, insert "AssignmentOperator Expression" to complete Assignment
Syntax error, insert ";" to complete Statement
String cannot be resolved to a variable
message cannot be resolved to a variable
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗?有人可以解释一下吗?

Era*_*ran 14

除非用大括号括起声明,否则不能在if语句中声明变量,因为声明必须具有范围.

这可以工作,因为变量是在if语句之外声明的:

String message;
if(true)
    message = "Assignment possible";
System.out.println(message)
Run Code Online (Sandbox Code Playgroud)

这不会通过编译,因为变量将在与周围代码相同的范围内声明,但只有在条件为真时才会声明,因此在所有情况下System.out.println(message)都不会message打印变量:

if(some condition)
    String message = "Time to leave earth";
System.out.println(message);
Run Code Online (Sandbox Code Playgroud)

您的条件始终为真的事实并没有什么不同,因为编译器必须支持任何if条件的所有结果.

现在,当您使用花括号括起声明时,可以将声明的变量限制为新范围:

if(some condition) {
    String message = "Time to leave earth";
    System.out.println(message); // this will pass compilation since message
                                 // is guaranteed to be found in this scope
}
System.out.println(message); // this won't pass compilation, since message is not 
                             // found in this scope
Run Code Online (Sandbox Code Playgroud)