java中try/catch效能和原理
部分內容轉載自http://blog.csdn.net/tao_zi7890/article/details/17584813
記得在做企業雲專案的時候,我接了兩個有意思的任務,一個是為幾個執行緒加很多的try/catch程式碼。catch的異常有好幾層,範圍最小的,或者說最精準的異常放在最上面,最後跟一個Exception e。類似這種
try {
} catch (IOException e) {
} catch (Exception e) {
}
還一個需求是在訂單流轉的三個執行緒裡面增加監控的程式碼,監控這三個主要執行緒的執行時間,當時的工程師特意讓我注意,增加的程式碼一定要寫在try/catch裡面,保證新增程式碼執行錯誤的時候,原有流程可以正常走下去。
正好今天有時間研究java中的try/catch執行原理,現在總結一下。
比如現在有兩段程式碼
private void test1() { List<String> testList = new ArrayList<>(); testList.add("1"); testList.add("2"); testList.add("a"); testList.add("4"); testList.add("5"); for (String str : testList) { try { int num = Integer.parseInt(str); System.out.println(num); } catch(NumberFormatException ex) { System.out.println(ex); } } }
private void test2() { List<String> testList = new ArrayList<>(); testList.add("6"); testList.add("a"); testList.add("8"); testList.add("9"); testList.add("10"); try { for (String str : testList) { int num = Integer.parseInt(str); System.out.println(num); } } catch(NumberFormatException ex) { System.out.println(ex); } }
先說功能上的區別:test1()的異常捕獲程式碼在迴圈裡面,當程式出現異常後,剩下的正常資料依然可以跑完,而test2()異常捕獲程式碼在迴圈外面,迴圈內出現異常整個處理就終止了。這樣的話,一般情況下我們對異常資料的處理方式其實是正常資料跑通流程,異常資料丟擲,test2()並不能滿足這種需求。
下面來看看效能問題,之前有看到資料說,try/catch要寫在迴圈外面,,防止出現效能的損失。不過今天看了try/catch的執行原理,結論是在沒有丟擲異常的情況下,效能完全沒區別。
討論帖地址:http://stackoverflow.com/questions/141560/should-try-catch-go-inside-or-outside-a-loop
異常處理帖地址:http://www.javaworld.com/javaworld/jw-01-1997/jw-01-hood.html?page=1
1、類會跟隨一張 異常表(exception table),每一個try catch都會在這個表裡新增行記錄,每一個記錄都有4個資訊(try catch的開始地址,結束地址,異常的處理起始位,異常類名稱)。
2、當代碼在執行時丟擲了異常時,首先拿著丟擲位置到異常表中查詢是否可以被catch(例如看位置是不是處於任何一欄中的開始和結束位置之間),如果可以則跑到異常處理的起始位置開始處理,如果沒有找到則原地return,並且copy異常的引用給父呼叫方,接著看父呼叫的異常表。。。以此類推。
所以最終的結論是,要根據需求,選擇合適的try/catch進行處理,滿足功能。
相關推薦
java中try/catch效能和原理
部分內容轉載自http://blog.csdn.net/tao_zi7890/article/details/17584813 記得在做企業雲專案的時候,我接了兩個有意思的任務,一個是為幾個執行緒加很多的try/catch程式碼。catch的異常有好幾層,範圍最小的,或者說
Java中try catch finally 中有異常和return時處理先後
public class TestDemo { private static String output = ""; public static void foo(int i) { try { if (i == 1) { throw new Exception(); }
java中try-catch模塊中with語句塊的作用
天突 java7 all 現在 NPU cat tput file try語句 以前寫try-catch時,遇到一些流、連接等對象,必定需要添加finally語句來關閉這些對象。今天突然發現try的with模塊可以省略在finally手動關閉的動作,可以通過將這些對象定義在
Java中 try--catch-- finally、throw、throws 的用法
一、try {..} catch {..}finally {..}用法 try { 執行的程式碼,其中可能有異常。一旦發現異常,則立即跳到catch執行。否則不會執行catch裡面的內容 } catch (Exception e) { 除非try裡面執行程式碼發生了異常,否則這裡的程式碼不會執行 }
java中try catch語句執行順序簡介
package com.string_lc; /** * @filename Test.java * @author l * @description */ public class Test { public static void main(String[] args) {
Java中try catch finally語句中含return語句的執行情況總結-程式設計陷阱
前言:有java程式設計基礎的人對java的異常處理機制都會有一定了解,而且可能感覺使用起來也比較簡單,但如果在try catch finally語句塊中遇到return語句,開發者可能就會遇到一些邏輯問題,甚至步入程式設計的陷阱。不信,我們先看看一段小程式,讀
java中try,catch,finally的合理應用
try {try { code that might throw exceptions } finally { code that might throw exceptions }} catch (Exception e) { show error dialog}
java 中try catch finally 的具體執行順序返回結果+程式碼測試
執行順序的重點就在finally中,具體如下: (1)、try:它裡面放置可能引發異常的程式碼(2)、catch:後面對應異常型別和一個程式碼塊,用於表明該catch塊用於處理這種型別的程式碼塊,可以
Java中try-catch-finally語句塊的應用
一、異常處理及catch的順序 catch塊跟在try語句後面,它可以是一個或多個;catch塊有一個引數,該引數是某種異常類的物件;多重catch語句中,異常型別必須子類在前父類在後;try語句塊不可以獨立存在,必須與catch或者finally塊共存
java中try catch與if else區別
有人說了try ...catch...不就是丟擲異常以文字形式顯示出來麼?if...else...也可以阿.else裡面寫showmessage不就可以麼??? 首先try提捕獲異常的,即異常並不是我們能預先知道的,所以不能用if什麼條件來判斷的。異常是需要在程式
java中 try catch的妙用
parseint 解決 ger 很多 導致 form exc mat 失敗 程序開發中,格式轉換的時候,經常由於字符串可能是其他的不可預知的符號導致,字符串轉數值失敗, 這個時候可以妙用try catch來解決,如下圖所示。其實,很多其他不可預知的異常情況,也可以用
java在迴圈中try catch 和在迴圈外的區別
例如在迴圈內try catch:for(int i=0;i<q.size();i++){ try{ method(q.get(i)[0]); }catch(Exception e
java中try 與catch的使用的詳細說明
try{ //程式碼區 }catch(Exception e){ //異常處理 } 程式碼區如果有錯誤,就會返回所寫異常的處理。 首先要清楚,如果沒有try的話,出現異常會導致程式崩潰。 而try則可以保證程式的正常執行下去,比如說: try{ int i = 1/0; }catch
java中try、catch、finally執行順序
在面試的時候,經常會問到關於try、catch、finally相關的問題。總結一下。 case 1 try{ } catch{ } finally{ } return; public int condition1(){ try {
java中HashMap、CurrentHashMap 工作原理&&和HashTable、HashSet的區別
HashMap和HashTable的區別 HashMap儲存的是鍵值對(接受null鍵值對),不支援synchronized,速度很快; HashTable不接受null鍵值對,可同步(Synchronized) 雖然HashMap是非Synchronized,但collection
Java中的類載入和Class.forName();java反射機制與原理
對於大部分人來說,第一次見到class.forName(String className)這句程式碼應該是在使用jdbc方式連線資料庫的時候。但這句程式碼本質上是什麼含義,做了什麼工作呢?本文將回答此問題。 理解Class.forName方法需要一些知識鋪墊,也就是
Java異常處理中try{}catch丟擲異常,後面程式碼還會繼續執行麼?
這張圖片上面顯示的程式碼執行之後將會輸出什麼?我們可以發現在procedure()函式結束之後函式後面的內容就不運行了,而主函式裡面的程式還是會繼續執行。反過來再測試如果先發生主函式裡面的異常那麼Pr
Java異常處理中try,catch,finally的各種組合用法
1.try+catch 程式的流程是:執行到try塊中,如果有異常丟擲,則轉到catch塊去處理。然後執行catch塊後面的語句 2.try+catch+finally 程式的流程是:執行到try
java中try 與catch的使用
//程式碼區 }catch(Exception e){ //異常處理 } 程式碼區如果有錯誤,就會返回所寫異常的處理。 首先要清楚,如果沒有try的話,出現異常會導致程式崩潰。 而try則可以保證程式的正常執行下去,比如說: try{ int i = 1/0; }catch(Exception e){
Java的try...catch的用法和作用(為什麼要用try...catch)
當程式執行過程中發生錯誤時,就會“ 丟擲異常',丟擲異常比終止程式要靈活得多,這是因為可以提供一個“ 捕獲” 異常的處理器 (handler) 對異常情況進行處理。 如果沒有提供處理器,程式就會終止,並在控制檯上打印出一條資訊, 其中給出了異常的型別。可能在前面已經看到過一