可以拋出也可以用來退出switch語句中不使用關鍵字break?爲什麼使用throw而不是break?可以使用而不是在switch語句中使用break嗎?
switch(number)
{
case 1:
throw new RuntimeException("Exception number 1");
case 2:
throw new RuntimeException("Exception number 2");
}
可以拋出也可以用來退出switch語句中不使用關鍵字break?爲什麼使用throw而不是break?可以使用而不是在switch語句中使用break嗎?
switch(number)
{
case 1:
throw new RuntimeException("Exception number 1");
case 2:
throw new RuntimeException("Exception number 2");
}
可以在switch
塊,但它不是一個良好的編碼/設計實踐中運用throw
。 throw
意在控制代碼中的異常/錯誤情況,而不是用於控制指令的執行。
儘管您可以使用throw
在switch
,我會建議不要在switch
中使用它。 :)
你說的是隻有一個的情況下,你需要拋出異常。開關設計用於運行一個案例並將其破解。如果它是在一個方法中,並且如果你只使用throw,那麼你將如何從該方法返回一個值? 簡而言之,throw將返回方法,但break不會。切換後可以繼續運行代碼,但不能使用throw。
有兩種情況下,您可以使用throw
中斷交換機的流量:
流量控制;在一般情況下,這是一個不好的實踐 - 你不想異常行爲決定你的程序決定下一步要做什麼。
不太可能但似乎合理的默認情況;如果你打在到達默認應該是一個不可能完成的情況下,卻發生了。不知何故。不可思議的。或者,如果您有嚴格的編碼標準,則要求轉換語句具有默認情況。
例子:
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");
}
}
突破用來防止掉落通到了下情況,當你拋出一個異常,也不會有掉落通
case 1:
throw new UnsupportedOperationException();
break; <-- compile error, unreachable code
它通常是有道理的拋出一個異常另有條款
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)從
throw new RuntimeException("Exception number 1");
得到值 「異常1號」 你必須賴特catch塊和呼叫E。的getMessage();
,如:
catch(RuntimeException e){
String str=e.getMessage();
}
這甚至是更多的開銷,你也可以通過數據僅僅是String對象。
結論: - 它更好地使用正常休息。
我看到拋出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[...];
}
我傾向於同意這一點。如果您在開關「案例」部分涵蓋了所有可能的情況,那麼爲什麼不在「默認」部分中引發異常以首先指示傳入參數是錯誤的,其次爲了防止開關構造的未來擴展。 – GeertVc
throw不能在switch語句中使用break而不是break。因爲throw只是用於例外,而switch用於條件目的......
除了'switch'中的'return'或'break'之外,你可以使用'throw',因爲它們都是突然完成的(也就是將控制權交還給當前正在運行的方法以外的地方)。 – Makoto
您不應該這樣做。絕對不應該用於控制流量。例外使用例外。如果交換機內發生異常,那就沒問題。 – NilsH
因爲您按照您輸入的字符數支付 –
您可能會在switch語句中引入的一個合理的標準位置是缺省情況。如果到達該案例表明輸入無效,則拋出異常是合理的。 – Aurand