[英]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
來中斷交換機的流量:
流量控制 ; 一般來說,這是一種不好的做法 - 您不希望出現特殊行為來決定您的計划下一步決定去哪里。
不太可能但似乎合理的默認情況 ; 如果你打在到達默認的應該是一個不可能完成的情況下,卻發生了。 不知何故。 不可思議的。 或者,如果您有嚴格的編碼標准,則要求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.