2012-12-19 7 views
14

So ist dies ein sonderbares, ich den Code selbst wissen, ist ziemlich nutzlos, aber was ich frage mich, warum ich den Fehler:eine nutzlose lokale Variable deklarieren

ich einige Code schrieb, ich dies geschrieben hatte, :

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

War das nicht an der Zeit, über den Geltungsbereich von variablen zu denken, dies offensichtlich nutzlos ist, weil ich nicht row vorbei am if ohnehin nutzen kann. Was verstehe ich nicht, warum ich den Fehler habe ich gemacht habe:

> 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(); 
       ^

Nun, wenn ich das nur ändern, wenn Scheck an:

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

Es wird gut kompilieren. Ich hatte den Eindruck, dass, wenn es eine Zeile unter der if gab, die geschweiften Klammern optional waren ... klar, es gibt auch andere Überlegungen, oder beide würden entweder kompilieren oder fehlschlagen.

Könnte mir jemand erklären oder auf ein Dokument verweisen, das erklärt, warum ich keine lokale Variable unter der if Bedingung ohne die geschweiften Klammern deklarieren kann?


EDIT: Hier ist die volle Funktion:

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

was kommt vor und nach das 'wenn'? –

+1

Bitte schreiben Sie Ihren vollständigen Code hier –

+0

@NikolayKuznetsov - Siehe bearbeiten. – Mike

Antwort

25

Wenn Sie eine if, for, while, do/while haben, müssen Sie es mit einer Aussage folgen. Eine Deklaration ist keine Aussage.

Von JLS 14.9 - The if Statement

IfThenStatement: 
    if (Expression) Statement 

IfThenElseStatement: 
    if (Expression) StatementNoShortIf else Statement 

IfThenElseStatementNoShortIf: 
    if (Expression) StatementNoShortIf else StatementNoShortIf 

ich annehmen, dass sie dies tun, weil jede Variable, die Sie erklären konnte nicht verwendet werden, da sie unmittelbar außerhalb des Bereichs wäre (mit Ausnahme der gleichen Erklärung)

+0

Da ist es. Vielen Dank! – Mike

+1

@PeterLawrey Ich bin nicht 100% sicher, aber dieser Satz aus [JLS 14.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.4) könnte relevanter sein - "Jede Deklarationserklärung einer lokalen Variablen ist unmittelbar durch einen Block_ enthalten." (Hervorhebung hinzugefügt) –

+0

Wenn ich 'if' in' while' ändere, kommt es zu demselben Fehler, also bin ich mir ziemlich sicher, dass dies die Regel ist –

1

Meine Vermutung ist, dass eine Erklärung nicht eine ausführbare Anweisung und eine Erklärung mit einer Zuordnung ist wirklich in zwei verschiedene Aussagen durch die unterbrochene Compiler, wobei die erste Anweisung (die Deklaration) nicht ausführbar ist. Ein if benötigt ein ausführbares Konstrukt, entweder einen Block oder eine ausführbare Anweisung.

Ich weiß, dass ich nicht in der Lage war, einen Breakpoint auf eine Non-Saussignment-Deklaration im Eclipse-Debugger zu setzen. Wahrscheinlich der gleiche Grund.