2012-12-19 8 views
14

quindi questo è uno strano, so che il codice stesso è abbastanza inutile, ma quello che mi chiedo il motivo per cui ho l'errore:Dichiarazione di una variabile locale inutile

stavo scrivendo del codice, avevo scritto questo :

if(scan.hasNextInt()) 
    int row = scan.nextInt(); 

non stava pensando a portata variabile, al momento, ovviamente questo è inutile perché non posso usare row oltre la if comunque. Quello che non capisco è il motivo per cui ho ottenuto l'errore che ho fatto:

> javac hw.java 
hw.java:25: '.class' expected 
    int row = scan.nextInt(); 
     ^
hw.java:25: not a statement 
    int row = scan.nextInt(); 
    ^ 
hw.java:25: illegal start of expression 
    int row = scan.nextInt(); 
      ^
hw.java:25: ';' expected 
    int row = scan.nextInt(); 
       ^

Ora, se ho solo modifico che se assegno a:

if(scan.hasNextInt()) { 
    int row = scan.nextInt(); 
} 

Si compilerà bene. Ho avuto l'impressione che se ci fosse 1 riga sotto lo if le parentesi graffe fossero facoltative ... chiaramente ci sono anche altre considerazioni o entrambe o sarebbero compilate o fallite.

Qualcuno potrebbe spiegarmi o indicarmi un documento che spieghi perché non è possibile dichiarare una variabile locale con il condizionale if senza parentesi graffe?


EDIT: Ecco la funzione completa:

public static char getinput() { 
    System.out.println("Where do you want to go? (row column)"); 
    Scanner scan = new Scanner(System.in); 
    if(scan.hasNextInt()) 
     int row = scan.nextInt(); 
    String input = scan.next(); 
    System.out.println(input); 
    return 'a';  
} 
+7

ciò che viene prima e dopo che 'se'? –

+1

Scrivi qui il tuo codice completo –

+0

@NikolayKuznetsov - Vedi modifica. – Mike

risposta

25

Se si dispone di un if, for, while, do/while è necessario seguirlo con una dichiarazione. Una dichiarazione non è una dichiarazione.

Da JLS 14.9 - The if Statement

IfThenStatement: 
    if (Expression) Statement 

IfThenElseStatement: 
    if (Expression) StatementNoShortIf else Statement 

IfThenElseStatementNoShortIf: 
    if (Expression) StatementNoShortIf else StatementNoShortIf 

Presumo che fanno questo perché qualsiasi variabile si dichiara non poteva essere usato come sarebbe fuori del campo di applicazione immediatamente (tranne la stessa dichiarazione)

+0

Eccolo. Grazie mille! – Mike

+1

@PeterLawrey Non sono sicuro al 100%, ma questa frase da [JLS 14.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.4) potrebbe essere più rilevante - "Ogni dichiarazione di dichiarazione di variabile locale è immediatamente contenuta da un blocco_". (enfasi aggiunta) –

+0

Cambiare il parametro 'if' in un' while' produce lo stesso errore, quindi in realtà sono abbastanza sicuro che questa sia la regola in vigore –

1

La mia ipotesi è che una dichiarazione non è un'istruzione eseguibile e una dichiarazione con un incarico che sta realmente spezzato in due dichiarazioni diverse da parte del compilatore, con la prima dichiarazione (la dichiarazione) non eseguibile. Un if richiede un costrutto eseguibile, un blocco o un'istruzione eseguibile.

So che non sono stato in grado di inserire un punto di interruzione su una dichiarazione di dichiarazione di non assegnazione nel debugger di Eclipse. Probabilmente la stessa ragione di fondo.