2012-12-19 13 views
14

więc jest to dziwne, jeden, wiem sam kod jest całkiem bezużyteczny, ale co zastanawiam się, dlaczego pojawia się błąd:Deklarowanie bezużyteczną lokalną zmienną

Pisałam jakiś kod, ja napisałem ten :

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

nie myślał o zmiennym zakresie w czasie, oczywiście jest to bezużyteczne, bo nie mogą korzystać row piłkę if tak. Co ja nie rozumiem dlaczego mam błąd robiłam:

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

Teraz gdybym tylko modyfikować że jeśli czek do:

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

będzie skompilować w porządku. Miałem wrażenie, że jeśli pod linią if znajduje się 1 linia, nawiasy klamrowe były opcjonalne ... oczywiście są też inne względy, albo obie kompilowałyby się albo zawodziły.

Czy ktoś może mi wyjaśnić, lub wskazać dokument, który wyjaśnia, dlaczego nie mogę zadeklarować zmiennej lokalnej pod warunkiem warunkowym bez nawiasów klamrowych?


EDIT: Oto pełna funkcja:

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

co jest przed i po że "jeśli"? –

+1

Proszę wpisać pełny kod tutaj –

+0

@NikolayKuznetsov - Patrz edycja. – Mike

Odpowiedz

25

Jeśli masz if, for, while, do/while trzeba śledzić ją z oświadczeniem. Deklaracja nie jest oświadczeniem.

Od JLS 14.9 - The if Statement

IfThenStatement: 
    if (Expression) Statement 

IfThenElseStatement: 
    if (Expression) StatementNoShortIf else Statement 

IfThenElseStatementNoShortIf: 
    if (Expression) StatementNoShortIf else StatementNoShortIf 

zakładam robią to, ponieważ każda zmienna zadeklarować nie może być stosowany jako byłoby poza zakresem natychmiast (z wyjątkiem samej deklaracji)

+0

To jest. Dziękuję Ci bardzo! – Mike

+1

@PeterLawrey Nie jestem w 100% pewny, ale to zdanie z [JLS 14.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.4) może być bardziej istotne - "Każda deklaracja deklaracji zmiennej lokalnej jest natychmiastowo blokowana przez blok_." (podkreślenie dodane) –

+0

Zmiana 'if' na' while' powoduje ten sam błąd, więc właściwie jestem pewien, że jest to reguła obowiązująca –

1

Domyślam się, że deklaracja nie jest wykonywalny oświadczenie i deklarację z cesją jest naprawdę podzielone na dwa różne oświadczenia kompilator, przy czym pierwsza instrukcja (deklaracja) nie jest wykonywalna. An jeśli wymaga wykonalnego konstruktu, albo bloku, albo instrukcji wykonywalnej.

Wiem, że nie udało mi się umieścić punktu przerwania w deklaracji deklaracji innej niż przypisanie w debugerze Eclipse. Prawdopodobnie ten sam podstawowy powód.

Powiązane problemy