1. 程式人生 > >無法捕獲異常:Java關於在catch中丟擲一個異常給外圍函式卻捕獲不到該異常的思考

無法捕獲異常:Java關於在catch中丟擲一個異常給外圍函式卻捕獲不到該異常的思考

先給出一串程式碼:

public class TestException {
	public TestException(){
	}
	
	boolean testEx()throws Exception{
		boolean ret=true;
		try{
			ret=testEx1();
		}
		catch(Exception e){
			System.out.println("testEx, catch exception");
			ret=false;
			throw e;
		}
		finally{
			System.out.println("testEx, finally:return value:"+ret);
			return ret;
		}
	}
	
	boolean testEx1()throws Exception{
		boolean ret=true;
		try{
			ret=testEx2();
			if(!ret){
				return false;
			}
			System.out.println("testEx1, at the end of try");
			return ret;
		}
		catch(Exception e){
			System.out.println("testEx1, catch exception");
			ret=false;
			throw e;
		}
		finally{
			System.out.println("testEx1, finally:return value:"+ret);
			return ret;
		}
	}
	
	boolean testEx2()throws Exception{
		boolean ret=true;
		try{
			int b=12;
			int c;
			for(int i=2;i>=-2;i--){
				c=b/i;
				System.out.println("i="+i);
			}
			return true;
		}
		catch(Exception e){
			System.out.println("testEx2, catch exception");
			ret=false;
			throw e;
		}
		finally {
			System.out.println("testEx2, finally:return value="+ret);
			return ret;
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestException testException1=new TestException();
		try{
			testException1.testEx();
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}

}

對於函式testEx2()中catch塊中丟擲的異常,testEx1()函式卻捕獲不到,這是為什麼呢?
我想過一種可能:testEx1()中將testEx2()的返回值賦值給ret,即 ret=testEx2(),而testEx2()中丟擲的異常在這個過程中被過濾掉了。因為如果我直接把testEx2()放在testEx1()中,而不是通過ret=testEx2()的方式,那麼這個異常是能夠被捕獲的。

原先,我也在網上向別人求證這個想法,也通過除錯想驗證這個想法,但顯然是無意義的,這個問題已經很明確了,這個想法已無可挑剔。

為什麼這麼說呢?首先,我們除錯發現這個捕獲不到的異常其實已經不存在了,因為當我們執行ret=testEx2()這條語句時,我們實際上是將一個值賦給一個變數,而原先testEx2()裡的程式碼已經不存在了,也就是說,在testEx1()函式中,testEx2()本就不存在,可以理解為testEx1()只是將testEx2()當作工具使用,並將用其所獲取的值賦給了變數ret,僅此而已。

相關推薦

無法捕獲異常Java關於在catch一個異常外圍函式捕獲異常思考

先給出一串程式碼: public class TestException { public TestException(){ } boolean testEx()throws Exception{ boolean ret=true; try{ r

異常安裝完Hadoop之後,命令列輸入hadoop到命令的解決方法

大多數原因是沒有配置環境變數解決方法 1. vim /etc/profile 2. 把這三條加到proflie檔案的最後export JAVA_HOME=XXXX(在安裝了jdk的前提下,echo $JAVA_HOME可以檢視得到)export HADOOP_HOME=XXX

java異常練習題定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類定義一個方法,在方法異常,在主方法觀察結果

題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。  定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類定義一個方法,在方法異常,在主方法觀察結果。

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟

自定義的異常異常處理異常

你可以用raise語句來引發一個異常。異常/錯誤物件必須有一個名字,且它們應是Error或Exception類的子類 下面是一個引發異常的例子: class ShortInputException(Exception): ‘’‘自定義的異常類’’’ def init(self, le

_092_Java_finally使用return會吃掉catch異常

轉自,感謝作者的無私分享。 如果在finally中使用return會吃掉catch中丟擲的異常,也會吃掉try或者catch中的return。 如果在finally中使用throw會吃掉catch中丟擲的異常,也會吃掉try或者catch中的return。 看例子:

不要在解構函式異常

轉載 : http://www.cnblogs.com/hbt19860104/archive/2012/10/22/2734006.html (很好的博文,贊!!!。解惑瞭如何處理析構函數出現異常現象,增加對解構函式的工作機制和作用域的相關理解。) 不要在解構函式中丟擲異常 1: 可以

27.能否在建構函式異常?解構函式呢?

首先,我們要明確一點!一個函式執行的過程中,如果丟擲異常,會導致函式提前終止! 在C++建構函式中,既需要分配記憶體,又需要丟擲異常時要特別注意防止記憶體洩露的情況發生。因為在建構函式中丟擲異常,在概念上將被視為該物件沒有被成功構造,因此當前物件的解構函式就不會被呼叫。同時

Fork/Join框架(五)在任務異常

宣告:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González     譯者:許巧輝 校對:方騰飛 在任務中丟擲異常 在Java中有兩種異常: 已檢查異常(Checked exceptions):這些異常必須在一

spring事務控制的方法異常回滾

最近做專案時,由於業務需要,在service中丟擲自定義異常時出現了事務不回滾的情況,具體情況如下: public void editEpidemic(Epidemic epidemic) throws EpidemicException{

C++建構函式異常

建構函式中丟擲異常會有怎樣的影響呢?如下實驗程式碼 #include <iostream> #include <stdexcept> using namespace std; class A { public: A(int n){} ~A(){cout

C++建構函式異常

建構函式中丟擲的異常   1、標準C++中定義建構函式是一個物件構建自己,分配所需資源的地 方,一旦建構函式執行完畢,則表明這個物件已經誕生了,有自己的行為和內部的執行狀態,之後還有物件的消亡過程(解構函式的執行)。可誰能保證物件的構造 過程一定能成功呢?說不定系統當前的某

捕獲java反射執行方法異常

一般在業務開發時需要向上層拋異常寫法如下: public void A() throws Exception{ throw new Exception(); } public void B()

JAVA程式與宣告異常

                                                                                         丟擲異常 上一篇文章中,

如何在Service方法異常並返回狀態或校驗結果?

在Service方法中,如果我們通過丟擲異常來進行事務處理(其實有更好的辦法:Spring事務配置),那麼我們的Service方法需要丟擲異常,但這裡有一個問題,之前都沒有考慮到,今天測試介面的時候發現的,問題:當發現檢驗失敗的時候,我們給Map設定了一個key為messa

java 異常處理之宣告異常

java 異常處理宣告丟擲異常 2.宣告丟擲異常是Java中處理異常的第二種方式 2.宣告丟擲異常是Java中處理異常的第二種方式 如果一個方法(中的語句執行時)可能生成某種異常,但是並不能確定如何處理這種異常,則此方

在javanative crash的方法

    最近要接入firebase crashlytics,一個crash分析平臺,要測一下native crash能否正常統計上報,找了半天才找到一個可以簡單的丟擲native crash的方法。 程式碼如下,用java調下面這個方法就可以丟擲native c

編寫可維護程式碼3適當的錯誤提示

編寫可維護的程式碼規則第3篇。 在js開發中,除錯錯誤是一個比較頭疼的事,又不像java的debug那麼方便,定位錯誤往往不是那麼容易,除非對程式碼熟悉無比,但即使是自己寫的程式碼,功能一複雜,時間一長,再想快速定位問題,至少我現在是比較頭疼的。此時,如果有一個比較友好的錯誤提示,那

Spring異常時,既要要返回錯誤資訊,還要做事務回滾

情況一:如果沒有在程式中手動捕獲異常,如下程式碼事務會回滾 Java程式碼   @Transactional(rollbackFor = { Exception.class })     public void test() throws Exception { 

Java 原碼、反碼、補碼,自定義的異常類,手動異常

1.byte 型佔一個位元組,正數按原碼儲存,負數按補碼儲存。第一位為符號符,“0”表示正數,“1”表示負數。 0000 0000表示 0 ,1000 0000 表示 -0,由於byte表示的範圍為256,+0,-0對應補碼都為0000000,所以補碼10000000沒有所為