如何更好的是:try catch塊的成本是多少?
if (condition) {
try {
//something
} catch(SomeEx ex) {}
}
的這個代替:
try {
if (condition) {
//something
}
} catch(SomeEx ex) {}
究竟JVM當我進入試塊做?
編輯: 我不想知道,在第二個例子總是去嘗試......請回答這個問題。
如何更好的是:try catch塊的成本是多少?
if (condition) {
try {
//something
} catch(SomeEx ex) {}
}
的這個代替:
try {
if (condition) {
//something
}
} catch(SomeEx ex) {}
究竟JVM當我進入試塊做?
編輯: 我不想知道,在第二個例子總是去嘗試......請回答這個問題。
在運行時執行明智,只要沒有例外,嘗試不花費任何東西。一旦發生異常,它只會花費運行時間。在這種情況下,如果進行評估,速度要慢得多。
在JVM規範,你看到有執行路徑上產生沒有額外的字節碼: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.12
if (condition) {
try {
//something
} catch(SomeEx ex) {}
}
是更好的使用,因爲它執行try塊如果條件ok.JVM編譯try塊並驗證catch塊或finally塊。我認爲優勢不在編譯期,而是在運行時。編譯時間我認爲沒有任何優勢
這就是我所說的..你能否回答這個問題? – Smolda
JVM編譯try塊並驗證catch塊或finally塊。我認爲優勢不在編譯期,而是在運行時。編譯時間我認爲沒有任何優勢 –
異常應該是例外,並非每次代碼運行。所以更好地檢查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當我進入試塊做?
+1我喜歡你的JLS報價方式比我的更好:) – linski
這是無稽之談。如果條件不太可能,則測試和捕獲的開銷是不合理的,並且該建議還引入(a)時間窗問題(b)兩次測試完全相同的條件的問題和(c)必須寫入相同的錯誤處理代碼兩次。 -1 – EJP
@EJP(1)我不同意你的看法,最好是避免某個NPE,而不是稍後嘗試拋出它。 (2)它沒有兩次測試相同的條件,請閱讀代碼中的註釋(3)我最好讓我的catch塊捕獲潛在的checked異常,而不是運行時異常! – NINCOMPOOP
try {if (condition) {...}} catch(SomeEx ex) {}
在這裏你處理了例外,如果它出現的情況下,如果也出現在if-block
裏面。
if (condition) {try {...} catch(SomeEx ex) {}}
在這裏你處理異常,如果只在if-block
內出現。如果條件出現問題,則不予處理。
所以這取決於實際的senario。
從性能的角度來看它應該是一樣的。拋出異常是一個代價高昂的操作(對於初學者,堆棧跟蹤必須被創建和填充)。 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在新白癡的回答。
>try {
code
}
catch and finally blocks . . .
在示例標記代碼段包含的代碼的一個或更多的法律線可能拋出異常。
所以,如果你覺得懷疑你如果條件是它將throw
的exception
把它inside.Otherwise放外面。
這取決於你的使用情況和實際情況。 –
@Nandkumar Tekale:不是不是..它總是一樣的。由於我們擁有相同的JAVA。 – Smolda
[可能使用try-catch塊的代價很高,即使從不拋出異常](http:// stackoverflow。com/questions/16451777/is-it-expensive-use-try-catch-blocks-even-if-an-exception-is-never-thrown) – e4c5