2010-10-08 91 views
71

我想我不明白開關櫃的範圍是如何工作的。開關櫃中的變量範圍

有人可以向我解釋爲什麼第一個代碼不能編譯,但第二個代碼沒有?

代碼1:

int key = 2; 
switch (key) { 
case 1: 
     String str = "1"; 
     return str; 
case 2: 
     String str = "2"; // duplicate declaration of "str" according to Eclipse. 
     return str; 
} 

代碼2:

int key = 2; 
if (key == 1) { 
     String str = "1"; 
     return str; 
} else if (key == 2) { 
     String str = "2"; 
     return str; 
} 

爲什麼變量 「STR」 的範圍內,沒有案例1載?

如果我跳過情況1變量「STR」從未宣佈的聲明...

回答

137

我會重複別人所說的:每個case子句中變量的範圍對應於整個switch聲明。你可以,但是,創建一個括號進一步嵌套範圍如下:

int key = 2; 
switch (key) { 
case 1: { 
    String str = "1"; 
    return str; 
    } 
case 2: { 
    String str = "2"; 
    return str; 
    } 
} 

生成的代碼,因爲現在每個case條款命名str變量成功編譯是在它自己的範圍之內。

+6

聽這傢伙。他是對的。 – John 2010-10-09 02:26:19

+21

正確。但是我會對我的團隊中使用這個「語法」的程序員非常惱火,而沒有很好的理由。這是一個混亂和錯誤的祕訣。它在視覺上隱藏了第一個case塊(如果它不是'return'),即使在右大括號之後「仍然繼續」的事實,並有助於忘記'break'。 – leonbloy 2011-05-18 18:16:43

+2

另外:使用'break'來維護和防止錯誤!即使不需要。 – worenga 2014-11-28 19:26:14

9

變量的範圍是整個switch聲明 - 所有的情況下,並默認情況下,如果包括在內。

這裏有一些其他的選擇...

選項1:

int key = 2; 
switch (key) { 
case 1: 
    return "1"; 
case 2: 
    return "2"; 
} 

選項2:

int key = 2; 
String str = null; 
switch (key) { 
case 1: 
    str = "1"; 
    return str; 
case 2: 
    str = "2"; 
    return str; 
} 
0

一些情況下可以在一個switch語句來執行。所以..

0

變量的範圍存在於開關的大括號和if語句之間。在示例代碼1中,開關大括號包含變量的聲明,這會導致編譯器出錯,因爲變量綁定的名稱已經生成。

在另一個例子中,它可以,因爲兩個變量都在自己的大括號(範圍)內聲明。

8

你似乎認爲每個case是一個有自己的本地作用域的塊,就像if/else塊一樣。不是。

改正這個概念的錯誤,因爲否則你會最終落入忘記case

0

break在第一種情況中的String聲明的範圍頻繁陷阱是switch語句中是很重要的,因此它被顯示爲重複的,而在第二個字符串被括在花括號內,這限制了範圍在if/else條件中,因此它在第二種情況下不是錯誤。

2

我認爲這是一個有效的問題,並且案例陳述的範圍假設是不可避免的。 調整自己,因爲Java作家已經使這不正確。

例如如果缺省語句在其範圍中佔第一行,而不是在case語句的結尾由break語句明確關閉的情況下出現問題。因此,情況1中的聲明:情況2中不應該可用,並且它具有並行範圍但不是嵌套的。