2012-12-19 46 views
14

所以這是一個奇怪的一個,我知道代碼本身是很沒用,但是我不知道爲什麼我得到的錯誤:聲明無用局部變量

我正在寫一些代碼,我寫了這:

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

不是當時想着變量的作用域,顯然這是無用的,因爲我不能使用row過去if反正。我不明白的是爲什麼我得到了我做了錯誤:

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

現在,如果我只是修改,如果檢查:

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

這將彙編的罰款。我的印象是,如果if下有1行,大括號是可選的......顯然還有其他考慮因素,或者兩者都可以編譯或失敗。

有人可以向我解釋,或者指向一個文檔,解釋爲什麼我不能在不帶大括號的情況下在條件爲if下聲明局部變量?


編輯:下面是完整的功能:

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

之前和之後是什麼那個'如果'? –

+1

請在這裏寫下您的完整代碼 –

+0

@NikolayKuznetsov - 查看編輯。 – Mike

回答

25

如果您有一個iffor,while,do/while您必須按照它的聲明。聲明不是一個聲明。

JLS 14.9 - The if Statement

IfThenStatement: 
    if (Expression) Statement 

IfThenElseStatement: 
    if (Expression) StatementNoShortIf else Statement 

IfThenElseStatementNoShortIf: 
    if (Expression) StatementNoShortIf else StatementNoShortIf 

我認爲他們這樣做是因爲你聲明任何變量不能使用,因爲它會馬上超出範圍(除相同的聲明)

+0

它在那裏。非常感謝你! – Mike

+1

@PeterLawrey我不是100%確定,但是[JLS 14.4](http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.4)可能更爲相關 - 「每個局部變量聲明語句都立即包含在block_中。」 (強調增加) –

+0

將'if'改爲'while'會導致相同的錯誤,所以實際上我很確定這是有效的規則 –

1

我的猜測是,聲明不是可執行語句,並通過賦值真的分成由兩個不同的語句聲明編譯器,第一個語句(聲明)不可執行。一個if需要一個可執行的結構,一個塊或一個可執行語句。

我知道我一直無法在Eclipse調試器的非調度聲明語句中放置斷點。可能是相同的根本原因。