簡體   English   中英

可以在switch語句中使用throw而不是break嗎?

[英]Can throw be used instead of break in a switch statement?

可以拋出也可以用來退出switch語句而不使用break關鍵字嗎? 為什么要使用投擲而不是休息?

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

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

  1. 流量控制 ; 一般來說,這是一種不好的做法 - 您不希望出現特殊行為來決定您的計划下一步決定去哪里。

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

    例:

     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"); } } 

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

第1:不是休息而是作為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表模型中。 在那里我使用return而不是break;

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[...];
}

你可以使用throw in switch block,但它不是很好的編碼/設計實踐。 throw用於控制代碼中的異常/錯誤情況,而不是用於控制指令的執行。

雖然你可以使用throw in switch ,但我建議不要在switch使用它。 :)

您只談論一個場景,您需要拋出異常。 switch旨在運行一個案例並打破它。 如果它在一個方法中,如果你只使用throw,那么你將如何從該方法返回一個值? 簡單來說,throw將返回方法,但break不會。 您可以在切換后繼續運行代碼,但不能使用throw。

break用於防止通過下一種情況下降,當你拋出一個異常時,就沒有掉落通過

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

在else子句中拋出異常通常是有意義的

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

使用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)從中獲取值“異常編號1”

throw new RuntimeException("Exception number 1");

你必須wright catch block並調用e.getMessage();

喜歡:

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

這是更多的開銷,您可以傳遞的數據也只是字符串對象。

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

throw不能在switch語句中使用而不是break。 因為throw僅用於異常,而switch用於條件目的......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM