2012-11-18 48 views
4

在下面的代碼:Java「重複本地變量」 - Java或Eclipse中引發的錯誤?

private static void example() { 
    String inputString = "test"; 
    switch (inputString) { 
     case "test": 
      String outputString = "The string said test"; 
     case "not test": 
      String outputString = "The string did not say test"; 
    } 
    /*Do stuff with ouputString*/   
} 

Eclipse的突出Case "not test"與錯誤Duplicate local variable outputString之後的行。但是,由於他們在switch聲明的獨立分支中,所以它們並不實際發生衝突,因爲一次只能有一個生效。

顯然,在這種情況下,我可以通過移動switch聲明之外的outputString聲明來解決問題。但是,在更復雜的程序中,解決方案可能並不那麼簡單。

這是否僅僅是Eclipse引發的錯誤,以防止糟糕的編程技術或實際的Java錯誤?

我對Java很新,很抱歉,如果這是一個新手問題 - 我有一個谷歌的「重複本地變量Java」,但到目前爲止,所有出現的人都在尋求幫助,修復問題(通常的解決方案是重命名其中一個變量),而不是討論問題本身。

+0

要小心,不要使用編譯時錯誤術語「扔」的工作方法。 –

+0

@MarkoTopolnik謝謝,我會研究兩者之間的區別。 – scubbo

回答

4

java中每個switch語句的變量範圍都是整個switch語句。

您可以通過添加括號像這樣創造更多的嵌套範圍:

switch (inputString) { 
     case "test": { 
      String outputString = "The string said test"; 
      break; 
     } 
     case "not test": { 
      String outputString = "The string did not say test"; 
      break; 
     } 
    } 
+0

嘿,謝謝!我的大部分背景都是在Python中,(我被告知)在範圍方面有一些明顯的非標準行爲。我試圖學習一種「真正的」語言,其中一些已經是一種粗魯的覺醒! – scubbo

4

你假設每個case標籤創建一個單獨的範圍 - 他們沒有。這裏的範圍是開關塊,所以你確實已經在一個範圍內聲明瞭2個具有相同名字的變量。

您可以爲每個案例標籤引入一個新的範圍,例如,

switch (inputString) { 
    case "test": { 
     String outputString = "The string said test"; 
     break; 
    } 
    case "not test": { 
     String outputString = "The string did not say test"; 
     break; 
    } 
} 

或者,如果你的交換機已經是很大的,也許你應該爲每一種情況下用於包裝所有你在那裏做

+0

感謝您的輸入! Upvoted有用的答案,但我接受了其他答案,因爲他首先給出了代碼示例。 – scubbo