2013-05-15 37 views
3

假設我正在將一個位圖加載到我的Android設備上。有很多可能的異常可以拋出。爲了簡單起見,我們取NullPointerExceptionOutOfMemoryError捕捉一個特定的異常比捕獲一個通用的更便宜嗎?

現在我有兩段代碼。

代碼1

try{ 
//load the bitmap 
} 
catch(Exception e) 
{ 
//do something 
} 

代碼2

try{ 
//load the bitmap 
catch (NullPointerException e) 
{ 
//do something 
} 
catch(OutOfMemoryError e) 
{ 
//do something else 
} 

是一條代碼比其它性能更有效明智?如果是這樣,爲什麼?

+1

我不知道這是否是多/少有效,但捕捉特定異常,並適當地處理它們通常是一個更好的做法 –

+0

有效從什麼角度?性能?可讀性?以後很容易找到錯誤? – assylias

+0

性能,當然。 –

回答

5

字節碼的角度來看它是更有效(少代碼)做第一個。

,但你應該NEVER看那樣的表現。

如果你對所有類型的例外相同的行爲,你應該使用的代碼的第一束,以任何其他方式,第二個。

在字節碼你有以下負責捕獲eceptions代碼:

L2 
    LINENUMBER 7 L2 
    FRAME SAME1 java/lang/NullPointerException 
    ASTORE 1 
    GOTO L4 
    L3 
    LINENUMBER 9 L3 
    FRAME SAME1 java/lang/Exception 
    ASTORE 1 
    L4 

因此,每個例外有一個代碼,負責沒收,但正如我所說,這是這些微小的差別,它不該」不予考慮。

+0

你能證實你有點回答嗎?從字節碼的角度來看,效果是否可以被感知?或者它可以忽略不計? –

+0

我已將字節碼添加到帖子中。唯一的情況是有更多的代碼和一個'NullPointerException'的跳轉。 –

+1

以前我從來沒有明確地表達過我的觀點,也正如米歇爾所說的那樣。但最好避免if語句的異常。顯然不是所有的異常都可以避免,但可以預見'NullPointerException'。 –

1

性能方面沒有區別,因爲只有一個追趕甚至在多個catch塊的情況下將被執行。

代碼明智的,是第一個是更好,因爲米哈爾說。明智的第二種方法更好,因爲您可以捕獲特定的異常並對其進行適當的處​​理。

邊注:不趕內存不足的錯誤不斷,其誤差不例外,你不能有效地

0

處理它,如果你有不同的行爲對每個異常的第二個比第一個好。

表演將是相同的。