2015-12-23 10 views
20

Mentre si lavora su qualcosa, sono incappato in questo pezzo di codice:Il curioso caso di "se" in Java

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

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

Perché c'è un errore di compilazione nel secondo caso, quando è possibile scrivere 'se 'condizioni in java senza le parentesi graffe?

Il messaggio di errore non sembra dare una corretta informazioni:

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 

mi manca qualcosa di ovvio qui? Qualcuno può spiegarlo?

+0

Si trova nello stesso file? Penso che la definizione condizionale non funzioni, e la precedente affermazione ha già definito una stringa chiamata "messaggio". La seconda istruzione tenta di ridefinirla, e questo dà questo strano messaggio di errore. – 0xCAFEBABE

+0

Dove useresti quella stringa 'message'? se non c'è un blocco non puoi usarlo dopo .. Non ha senso scrivere questo – Hacketo

+1

Per essere ottuso, non è permesso perché [specifica della lingua] (http://docs.oracle.com/javase/specs /jls/se8/html/jls-14.html#jls-14.5) non lo consente; vedere il duplicato collegato per ulteriori spiegazioni approfondite. –

risposta

14

Non è possibile dichiarare una variabile all'interno di un'istruzione if se non si circonda la dichiarazione con parentesi graffe, poiché la dichiarazione deve avere un ambito.

Questo potrebbe funzionare, dal momento che la variabile è dichiarata al di fuori del if:

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

Questo non passa la compilazione, dal momento che la variabile sarebbe stata dichiarata nello stesso ambito come il codice circostante, ma sarebbe essere dichiarata solo se la condizione è vera, quindi System.out.println(message) non avrà una variabile message per stampare in tutti i casi:

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

il fatto che la vostra condizione è sempre vero, non fare la differenza, dal momento che il compilatore mu sosterrà tutti i risultati di una qualsiasi condizione.

Ora, quando si circondi la dichiarazione con parentesi graffe, limitate la vostra variabile dichiarata per un nuovo ambito:

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

La dichiarazione-controllato di un if affermazione è o una singola istruzione o di un blocco. Una singola affermazione non può essere una dichiarazione-dichiarazione.

Problemi correlati