2013-07-31 60 views
6

如何更好的是:try catch塊的成本是多少?

if (condition) { 
    try { 
    //something 
    } catch(SomeEx ex) {} 
} 

的這個代替:

try { 
    if (condition) { 
    //something 
    } 
} catch(SomeEx ex) {} 

究竟JVM當我進入試塊做?

編輯: 我不想知道,在第二個例子總是去嘗試......請回答這個問題。

+1

這取決於你的使用情況和實際情況。 –

+0

@Nandkumar Tekale:不是不是..它總是一樣的。由於我們擁有相同的JAVA。 – Smolda

+0

[可能使用try-catch塊的代價很高,即使從不拋出異常](http:// stackoverflow。com/questions/16451777/is-it-expensive-use-try-catch-blocks-even-if-an-exception-is-never-thrown) – e4c5

回答

7

在運行時執行明智,只要沒有例外,嘗試不花費任何東西。一旦發生異常,它只會花費運行時間。在這種情況下,如果進行評估,速度要慢得多。

在JVM規範,你看到有執行路徑上產生沒有額外的字節碼: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.12

+1

T0 aload_0 //開始嘗試阻止 – Smolda

+1

@Smolda - 我不明白您的意見。你是否想說規範示例代碼中的'aload_0'是爲了嘗試?那是不正確的。在下一行中加載方法調用的'this'引用。無論您是否使用嘗試,這都是必要的。示例代碼中的註釋有點令人誤解。 – FrankPl

+0

+1的確切參考 – linski

0
if (condition) { 
    try { 
    //something 
    } catch(SomeEx ex) {} 
} 

是更好的使用,因爲它執行try塊如果條件ok.JVM編譯try塊並驗證catch塊或finally塊。我認爲優勢不在編譯期,而是在運行時。編譯時間我認爲沒有任何優勢

+0

這就是我所說的..你能否回答這個問題? – Smolda

+0

JVM編譯try塊並驗證catch塊或finally塊。我認爲優勢不在編譯期,而是在運行時。編譯時間我認爲沒有任何優勢 –

0

異常應該是例外,並非每次代碼運行。所以更好地檢查try ing之前的狀況!

if (condition) { 
    try { 
    //something 
    } catch(SomeEx ex) {} 
} 

確保,if (condition)本身並不拋出Exception

這取決於您的使用情況和功能。例如,這會更好:

if (someObject!=null) { 
    try { 
    someObject.getSomething(); // getSomething() potentially throws some Exception 
    } catch(SomeEx ex) {} 
} 

究竟JVM當我進入試塊做?

閱讀JVM spec 2.10

+0

+1我喜歡你的JLS報價方式比我的更好:) – linski

+0

這是無稽之談。如果條件不太可能,則測試和捕獲的開銷是不合理的,並且該建議還引入(a)時間窗問題(b)兩次測試完全相同的條件的問題和(c)必須寫入相同的錯誤處理代碼兩次。 -1 – EJP

+2

@EJP(1)我不同意你的看法,最好是避免某個NPE,而不是稍後嘗試拋出它。 (2)它沒有兩次測試相同的條件,請閱讀代碼中的註釋(3)我最好讓我的catch塊捕獲潛在的checked異常,而不是運行時異常! – NINCOMPOOP

3
try {if (condition) {...}} catch(SomeEx ex) {} 

在這裏你處理了例外,如果它出現的情況下,如果也出現在if-block裏面。

if (condition) {try {...} catch(SomeEx ex) {}} 

在這裏你處理異常,如果只在if-block內出現。如果條件出現問題,則不予處理。

所以這取決於實際的senario。

1

從性能的角度來看它應該是一樣的。拋出異常是一個代價高昂的操作(對於初學者,堆棧跟蹤必須被創建和填充)。 try塊的存在不具有(或可忽略的)性能損失。

請參閱Should java try blocks be scoped as tightly as possible

當我輸入try block時,實際上JVM做了什麼?

JLS 14.20.1. Execution of try-catch

一個try語句沒有finally塊,先執行try塊執行。然後有一個選擇:

  • 如果try塊的執行正常完成,則不會採取進一步的操作並且try語句正常完成。

  • 如果try塊的執行突然完成,因爲值V的拋,然後有一個選擇:

    • 如果V的運行時類型的分配與(第5.2節兼容)try語句的任何catch子句的可捕獲異常類,則選擇第一個(最左邊的)這樣的catch子句。的值V被分配給所選擇的catch子句的參數,並且執行該catch子句的塊,然後有一個選擇:

      • 如果塊正常完成,則try語句正常完成。

      • 如果該塊由於任何原因突然完成,則由於相同的原因,try語句突然完成。

    • 如果V的運行時類型不是分配與可捕獲的異常類try語句中的任何catch子句的兼容,那麼try語句突然結束,因爲該值V.

      的拋
  • 如果try塊的執行由於任何其他原因突然完成,則try語句由於相同的原因突然完成。

編輯:

對於一個完整的異常說明請參閱JVM 2.10 link新白癡的回答

0

If you see oracle docs

>try { 
    code 
} 
catch and finally blocks . . . 

在示例標記代碼段包含的代碼的一個或更多的法律線可能拋出異常。

所以,如果你覺得懷疑你如果條件是它將throwexception把它inside.Otherwise放外面。