Подтвердить что ты не робот

Любопытный случай "если" в Java

Во время работы над чем-то я наткнулся на этот фрагмент кода:

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

if(true)
    String message = "Time to leave earth";  // error!

Почему во втором случае возникает ошибка компиляции, когда можно писать условия "if" в java без фигурных скобок?

Сообщение об ошибке, похоже, не дает правильной информации:

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

Я пропустил что-то очевидное здесь? Может кто-нибудь объяснить это?

4b9b3361

Ответ 1

Вы не можете объявить переменную внутри оператора if, если вы не окружите декларацию фигурными фигурными скобками, так как объявление должно иметь область видимости.

Это будет работать, поскольку переменная объявляется вне оператора if:

String message;
if(true)
    message = "Assignment possible";
System.out.println(message)

Это не передает компиляцию, так как переменная будет объявлена ​​в той же области, что и окружающий код, но она будет объявлена ​​только в том случае, если условие истинно, поэтому System.out.println(message) не будет иметь переменной message печать во всех случаях:

if(some condition)
    String message = "Time to leave earth";
System.out.println(message);

Тот факт, что ваше условие всегда истинно, не имеет никакого значения, поскольку компилятор должен поддерживать все результаты любого условия 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

Ответ 2

Управляемый оператор оператора if представляет собой либо один оператор, либо блок. Один оператор не может быть объявлением.