無法捕獲異常: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中處理異常的第二種方式 如果一個方法(中的語句執行時)可能生成某種異常,但是並不能確定如何處理這種異常,則此方
在java中丟擲native 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沒有所為