2009-09-15 29 views
-3

在Java中:哪些是性能最高的代碼,爲什麼?ElseIf反對拋出異常的最佳實踐

if (x==1) { 
    .... 
} else if (x==2) { 
    .... 
} else if (x==3) { 
    .... 
} else if (x==4) { 
    .... 
} 
... rest code here... 

or 

try { 
    if (x==1) { 
     ... 
     throw MyException(1); 
    } 
    if (x==2) { 
     ... 
     throw MyException(2); 
    } 
    if (x==3) { 
     ... 
     throw MyException(3); 
    } 
    if (x==4) { 
     ... 
     throw MyException(4); 
    } 
} catch(MyException MEx) { 
    ... rest code here ... 
} 

非常感謝!

+5

你應該使用你知道的開關 – 2009-09-15 15:34:10

+0

可能使用開關 - 但記住開關(和ifs問題這樣的代碼塊)是一種不好的代碼異味。在這種情況下,他可能想要的是對數據結構進行表查找,但可能需要更多..將取決於{....}中的內容,但幾乎不希望看到/ /上市。 – 2009-09-15 15:44:15

+0

也許這只是我,但是當任何語言的開關標準特徵被標記爲「壞代碼味道」時,它會讓我覺得非常奇怪。 – 2009-09-15 15:45:45

回答

13

在您的示例中,您正在使用異常進行流量控制。例外是昂貴的操作(或者至少比ifelse-if塊貴得多)。例外情況只能用於特殊情況。

此外,使用else if將確保只要找到匹配的案例就停止檢查。只使用if將全部檢查它們,並且任何匹配的案例都將被執行。如果您有很多案例,並且按照最常見的案例排序,那麼使用if-else-if的表現會更好。

+0

+1評論說,這兩個街區實際上做了不同的事情。 – 2009-09-15 16:34:11

+0

如果使用throw,則使用us我不能執行其他任何情況,任何方式...現在,對於我來說,例外情況比其他情況更加昂貴。 非常感謝托馬斯! – Mblua 2009-09-15 18:13:48

0

目前,兩者不具可比性。爲什麼把第二個例子中的「其餘代碼」放在異常處理程序中,當第一個例子中沒有提到這個異常?如果該異常肯定會被拋出,那麼第一個中的「其餘代碼」將永遠不會被執行。

0

不是使用異常時,您會獲得更多性能。但例外情況是特殊的結構,不要與控制流結構混淆,如if-else

2

不僅第二個版本的性能會變差,讀者也會感到困惑,而不是意圖如何使用異常。

4

其他人已經回答了你的問題,但我想我會指出...

只是因爲Java不具備「轉到」命令(實現),並不意味着你應該使用異常模擬它們。

0

不是說我是switch語句的忠實粉絲,但不是像教科書那樣使用它們?

switch (x) { 
    case 1: 

     break; 
    case 2: 

     break; 
    default: 
     break; 
    } 
... 
+0

這取決於。在這個特定的例子中,因爲所有東西都使用==進行比較,所以開關可以工作。但是,如果您想要執行多個塊,請使用==,<, >,<=, and > =,那麼if/else-if會更好。 – 2009-09-15 15:41:21

+0

尼克,你搞砸了你的switch語句,你只需要一個開關(x)並添加一個默認值: – DanM 2009-09-15 15:49:33

+0

感謝Dan,試圖變快並不總是一個好主意;-) – NickDK 2009-09-15 15:57:50

0

...這是最性能的代碼

的IF/ELSEIF構造。

爲什麼?

因爲後來涉及類型MyException的對象的創建(其內部可以填充堆棧跟蹤,爲對象分配存儲器,與所述異常代碼分配變量)

雖然差可以不執行一見鍾情最糟糕的是,這絕對是一種不好的例外情況。

我可以給你(或嘗試)關於它的解釋,但更好的是供您對此事的權威閱讀:

有效的Java項目: Use exception for exceptional conditions

作者:Joshua Bloch。