2013-05-16 151 views
4

可以拋出也可以用來退出switch語句中不使用關鍵字break?爲什麼使用throw而不是break?可以使用而不是在switch語句中使用break嗎?

switch(number) 
{ 
    case 1: 
     throw new RuntimeException("Exception number 1"); 
    case 2:  
     throw new RuntimeException("Exception number 2"); 
} 
+12

您不應該這樣做。絕對不應該用於控制流量。例外使用例外。如果交換機內發生異常,那就沒問題。 – NilsH

+5

因爲您按照您輸入的字符數支付 –

+0

您可能會在switch語句中引入的一個合理的標準位置是缺省情況。如果到達該案例表明輸入無效,則拋出異常是合理的。 – Aurand

回答

1

可以在switch塊,但它不是一個良好的編碼/設計實踐中運用throwthrow意在控制代碼中的異常/錯誤情況,而不是用於控制指令的執行。

儘管您可以使用throwswitch,我會建議不要在switch中使用它。 :)

0

你說的是隻有一個的情況下,你需要拋出異常。開關設計用於運行一個案例並將其破解。如果它是在一個方法中,並且如果你只使用throw,那麼你將如何從該方法返回一個值? 簡而言之,throw將返回方法,但break不會。切換後可以繼續運行代碼,但不能使用throw。

9

有兩種情況下,您可以使用throw中斷交換機的流量:

  1. 流量控制;在一般情況下,這是一個不好的實踐 - 你不想異常行爲決定你的程序決定下一步要做什麼。

  2. 不太可能但似乎合理的默認情況;如果你打在到達默認應該是一個不可能完成的情況下,卻發生了。不知何故。不可思議的。或者,如果您有嚴格的編碼標準,則要求轉換語句具有默認情況。

    例子:

    public class Test { 
        public static enum Example { 
         FIRST_CASE, 
         SECOND_CASE; 
        } 
        public void printSwitch(Example theExampleCase) { 
         switch(theExampleCase) { 
          case FIRST_CASE: 
           System.out.println("First"); 
           break; 
          case SECOND_CASE: 
           System.out.println("Second"); 
           break; 
          default: // should be unreachable! 
           throw new IllegalStateException(
         "Server responded with 724 - This line should be unreachable"); 
        } 
    } 
    
0

突破用來防止掉落通到了下情況,當你拋出一個異常,也不會有掉落通

case 1: 
     throw new UnsupportedOperationException(); 
     break; <-- compile error, unreachable code 

它通常是有道理的拋出一個異常另有條款

switch (op) { 
    case 1: 
     // do something 
     break; 
    ... 
    default: 
     throw new UnsupportedOperationException(); 
    } 
0

使用throw而不是break的問題很少;

1)當你拋出一些異常的函數的其餘部分的執行停止。

即:

int m=0; 
    switch (m) { 
    case 0: 
     y=10; 
     break; 
    case 2: 
     y=11; 
     break; 
    default: 
     break; 
    } 
    System.out.println(y);//this y will never be printed if Exceptions are thrown 

2)異常通常表示某些錯誤條件,而不是每次都應該創建例外切換。

3)從

throw new RuntimeException("Exception number 1"); 

得到值 「異常1號」 你必須賴特catch塊和呼叫E。的getMessage();

,如:

catch(RuntimeException e){ 
     String str=e.getMessage(); 
    } 

這甚至是更多的開銷,你也可以通過數據僅僅是String對象。

結論: - 它更好地使用正常休息。

1

我看到拋出switch語句的一些原因。

1st:不是代替中斷,而是作爲default情況的主體。考慮下面的例子,其中一個開關上的一個枚舉定義:

pubic enum E { 
    A, 
    B 
} 

開關如,因爲它首先被寫入的樣子的時間:

E e = ...; 
switch (e) { 
    case A: 
    ... 
    break; 
    case B: 
    ... 
    break; 
    default: 
    throw new IllegalStateException("Unknown enumeration value " + e); 
} 

的擲是用於向將來的擴展備用枚舉E

第二種:有時候我有小的getter函數,比如在Swing table模型中。在那裏我使用回報而不是休息;

public String getColumnName(int col) 
{ 
    switch (col) 
    { 
    case 0: return "Column 0"; 
    case 1: return "Column 1"; 
    ... 

這是爲了簡潔緊湊或的緣故。有人可能會說這些回報打破了控制流程。這是真的。不過,我認爲這是因爲緊湊的原因,它可能在這裏被允許。

如果您接受在這種情況下return而不是break你可以接受throw過這裏。

Object[] x = ...; // get some array which is not null from a function which 
        // only returns arrays, e.g. OSGI services 
switch (x.length) 
{ 
    case 0: throw new IllegalArgumentException("No service defined"); 
    case 1: return x[0]; // return the only available service 
    default: 
    ... // evaluate all services and return the best matching one 
    return x[...]; 
} 
+0

我傾向於同意這一點。如果您在開關「案例」部分涵蓋了所有可能的情況,那麼爲什麼不在「默認」部分中引發異常以首先指示傳入參數是錯誤的,其次爲了防止開關構造的未來擴展。 – GeertVc

-1

throw不能在switch語句中使用break而不是break。因爲throw只是用於例外,而switch用於條件目的......

+0

除了'switch'中的'return'或'break'之外,你可以使用'throw',因爲它們都是突然完成的(也就是將控制權交還給當前正在運行的方法以外的地方)。 – Makoto

相關問題