1. 程式人生 > >java中try/catch效能和原理

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進行處理,滿足功能。

相關推薦

javatry/catch效能原理

部分內容轉載自http://blog.csdn.net/tao_zi7890/article/details/17584813 記得在做企業雲專案的時候,我接了兩個有意思的任務,一個是為幾個執行緒加很多的try/catch程式碼。catch的異常有好幾層,範圍最小的,或者說

Javatry catch finally 有異常return時處理先後

public class TestDemo { private static String output = ""; public static void foo(int i) { try { if (i == 1) { throw new Exception(); }

javatry-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裡面執行程式碼發生了異常,否則這裡的程式碼不會執行 }

javatry catch語句執行順序簡介

package com.string_lc; /** * @filename Test.java * @author l * @description */ public class Test { public static void main(String[] args) {

Javatry catch finally語句含return語句的執行情況總結-程式設計陷阱

前言:有java程式設計基礎的人對java的異常處理機制都會有一定了解,而且可能感覺使用起來也比較簡單,但如果在try catch finally語句塊中遇到return語句,開發者可能就會遇到一些邏輯問題,甚至步入程式設計的陷阱。不信,我們先看看一段小程式,讀

javatry,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塊用於處理這種型別的程式碼塊,可以

Javatry-catch-finally語句塊的應用

一、異常處理及catch的順序   catch塊跟在try語句後面,它可以是一個或多個;catch塊有一個引數,該引數是某種異常類的物件;多重catch語句中,異常型別必須子類在前父類在後;try語句塊不可以獨立存在,必須與catch或者finally塊共存

javatry 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

javatrycatch的使用的詳細說明

try{ //程式碼區 }catch(Exception e){ //異常處理 } 程式碼區如果有錯誤,就會返回所寫異常的處理。 首先要清楚,如果沒有try的話,出現異常會導致程式崩潰。 而try則可以保證程式的正常執行下去,比如說: try{ int i = 1/0; }catch

javatrycatch、finally執行順序

在面試的時候,經常會問到關於try、catch、finally相關的問題。總結一下。 case 1     try{ } catch{ } finally{ } return; public int condition1(){ try {

javaHashMap、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

javatrycatch的使用

//程式碼區 }catch(Exception e){ //異常處理 } 程式碼區如果有錯誤,就會返回所寫異常的處理。 首先要清楚,如果沒有try的話,出現異常會導致程式崩潰。 而try則可以保證程式的正常執行下去,比如說: try{ int i = 1/0; }catch(Exception e){

Javatry...catch的用法作用(為什麼要用try...catch

當程式執行過程中發生錯誤時,就會“ 丟擲異常',丟擲異常比終止程式要靈活得多,這是因為可以提供一個“ 捕獲” 異常的處理器 (handler) 對異常情況進行處理。 如果沒有提供處理器,程式就會終止,並在控制檯上打印出一條資訊, 其中給出了異常的型別。可能在前面已經看到過一