2015-12-23 2 views
20

Во время работы над чем-то, я наткнулся на этот кусок кода:Любопытный случай «если» в Java

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

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

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

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

+0

Это в том же файле? Я думаю, что условное определение не работает, и предыдущий оператор уже определил строку, называемую «сообщение». Второй оператор пытается переопределить его, и это дает это странное сообщение об ошибке. – 0xCAFEBABE

+0

Где бы вы использовали эту строку 'message'? если нет блока, вы не сможете его использовать после .. Нет смысла писать это – Hacketo

+1

Чтобы быть тупым, это запрещено, потому что [спецификация языка] (http://docs.oracle.com/javase/specs /jls/se8/html/jls-14.html#jls-14.5) не позволяет; см. связанный дубликат для более подробных объяснений. –

ответ

14

Вы не можете объявить переменную внутри оператора 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(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 
0

контролируемое Заявление if заявления либо один оператор или блок. Один оператор не может быть объявлением.

Смежные вопросы