2013-03-20 31 views
3

爲什麼我不能在每個具有相同名稱的情況下創建變量。例如,從下面的代碼中,case 3它會抱怨String name已經存在 - 但爲什麼呢? Case 1從來沒有,也永遠不會被調用。重新實例化開關盒中的變量

我不想從switch-case中提取出定義。 那麼爲什麼要使用if語句來定義每種情況下的相同名稱,但是在switch-case中卻沒有?

下面是一個簡單的Java代碼與開關殼體:

int type = 3; 

switch (type) { 
    case 1: 
     String name = (String) respone.get("name"); 
     user.setName(name); 
     break; 
    case 2: 
     String surname = (String) respone.get("surname"); 
     user.setSurname(surname); 
     break; 
    case 3: 
     String name = (String) respone.get("name"); 
     user.clearName(name); 
     break; 
    default: 
     ... 
} 
+1

答案可能是「因爲」。我猜測這是因爲''case:'塊在編譯器方面並不是真正的塊 - 它們是在一個'switch'塊中得到的標籤。所以局部變量的範圍就是那個開關塊。 – millimoose 2013-03-20 16:06:13

+0

你可以在你調用的函數中直接放置鑄造的'(String)respone.get(「foo」)'... – LaGrandMere 2013-03-20 16:07:12

+0

一個很好的問題,但已經回答了很多次,例如重複:http:// stackoverflow。 com/a/3894215/1081849 – sbk 2013-03-20 16:08:23

回答

7

寫每個case語句在不同的塊:

switch (type) { 
    case 1: { 
     String name = (String) respone.get("name"); 
     user.setName(name); 
     break; 
    } 
    case 2: { 
     String surname = (String) respone.get("surname"); 
     user.setSurname(surname); 
     break; 
    } 
    ... 
} 
+2

哇。第一次看到切換塊!每天學習東西! – 2013-03-20 16:08:16

4

name已經存在,因爲箱子在概念上是在同一個塊中。案例:實質上是一個標籤switch聲明只是跳轉到適當的標籤。請參閱here for more info on labels in Java(不限於switch聲明)。

要想看到這個,想象一下如果你沒有break語句。您可以在case條款中初始化name,並進入下一個條款。如果這是一個問題,請將每個案例子句放在單獨的{}區塊中。

0

因爲即使它們互相排斥,它們也存在於相同的Switch塊中。因此,可以在單獨的塊中寫入每個case子句,以避免該錯誤。

0

記住case是不是你的範圍,該塊{ .. }

0

整個開關被包含在一個塊。如果聲明變量沒有括號在開關那麼它的範圍始終保持開關

case 1: { 
    String name = (String) respone.get("name"); 
    user.setName(name); 
    break; 
    } 
case 2: { 
    String surname = (String) respone.get("surname"); 
    user.setSurname(surname); 
    break; 
    } 
case 3: { 
    String name = (String) respone.get("name"); 
    user.clearName(name); 
    break; 
    } 
0

:你可以在自己的塊包裹每一種情況下。

無論您在哪裏聲明其第一個開關塊或第二個開關塊。如果你首先聲明它,那麼它可以通過切換後訪問。

如果你想要有相同的變量名,那麼你可以通過加上大括號或塊來做到這一點,因爲那個變量作用域仍然在塊中。

switch (type) { 
    case 1: { 
     String name = (String) respone.get("name"); 
     user.setName(name); 
     break; 
    } 
    case 2: { 
     String surname = (String) respone.get("surname"); 
     user.setSurname(surname); 
     break; 
    } 
    case 3: { 
     String name = (String) respone.get("name"); 
     user.clearName(name); 
     break; 
    } 
    default: 
     ... 
}