fancydeepin
毋意,毋必,毋固,毋我。
BlogJava
首頁
新隨筆
聯系
聚合
管理
隨筆-126 評論-247 文章-5 trackbacks-0
java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?
前言:
java 中的異常處理機制你真的理解了嗎?掌握了嗎?
catch 體里遇到 return 是怎么處理? finally 體遇到 return 怎么辦?finally 體里有 System.exit() 方法怎么處理?當 catch 和 finally 體里同時遇上 return 怎么辦?
相信你在處理異常的時候不是每次都把它 throws 掉就完事了,很多時候異常是需要我們自己來 catch 并針對所拋出的 Exception 做一些后續的處理工作。
直接上代碼,先貼下面測試需要調用的方法:
1
2
//
catch 后續處理工作
3
public
static
boolean
catchMethod()
{
4
System.out.print(
"
call catchMethod and return --->>
"
);
5
return
false
;
6
}
7
//
finally后續處理工作
8
public
static
void
finallyMethod()
{
9
System.out.println();
10
System.out.print(
"
call finallyMethod and do something --->>
"
);
11
}
12
1. 拋出 Exception,沒有 finally,當 catch 遇上 return
1
2
public
static
boolean
catchTest()
{
3
try
{
4
int
i
=
10
/
0
;
//
拋出 Exception,后續處理被拒絕
5
System.out.println(
"
i vaule is :
"
+
i);
6
return
true
;
//
Exception 已經拋出,沒有獲得被執行的機會
7
}
catch
(Exception e)
{
8
System.out.println(
"
-- Exception --
"
);
9
return
catchMethod();
//
Exception 拋出,獲得了調用方法并返回方法值的機會
10
}
11
}
12
后臺輸出結果:
1
2
--
Exception
--
3
call catchMethod and
return
--->>
false
4
2. 拋出 Exception,當 catch 體里有 return,finally 體的代碼塊將在 catch 執行 return 之前被執行
1
2
public
static
boolean
catchFinallyTest1()
{
3
try
{
4
int
i
=
10
/
0
;
//
拋出 Exception,后續處理被拒絕
5
System.out.println(
"
i vaule is :
"
+
i);
6
return
true
;
//
Exception 已經拋出,沒有獲得被執行的機會
7
}
catch
(Exception e)
{
8
System.out.println(
"
-- Exception --
"
);
9
return
catchMethod();
//
Exception 拋出,獲得了調用方法的機會,但方法值在 finally 執行完后才返回
10
}
finally
{
11
finallyMethod();
//
Exception 拋出,finally 代碼塊將在 catch 執行 return 之前被執行
12
}
13
}
14
后臺輸出結果:
1
2
--
Exception
--
3
call catchMethod and
return
--->>
4
call finallyMethod and
do
something
--->>
false
5
3. 不拋 Exception,當 finally 代碼塊里面遇上 return,finally 執行完后將結束整個方法
1
2
public
static
boolean
catchFinallyTest2()
{
3
try
{
4
int
i
=
10
/
2
;
//
不拋出 Exception
5
System.out.println(
"
i vaule is :
"
+
i);
6
return
true
;
//
獲得被執行的機會,但執行需要在 finally 執行完成之后才能被執行
7
}
catch
(Exception e)
{
8
System.out.println(
"
-- Exception --
"
);
9
return
catchMethod();
10
}
finally
{
11
finallyMethod();
12
return
false
;
//
finally 中含有 return 語句,這個 return 將結束這個方法,不會在執行完之后再跳回 try 或 catch 繼續執行,方法到此結束,返回 false
13
}
14
}
15
后臺輸出結果:
1
2
i vaule is :
5
3
4
call finallyMethod and
do
something
--->>
false
5
4. 不拋 Exception,當 finally 代碼塊里面遇上 System.exit() 方法 將結束和終止整個程序,而不只是方法
1
2
public
static
boolean
finallyExitTest()
{
3
try
{
4
int
i
=
10
/
2
;
//
不拋出 Exception
5
System.out.println(
"
i vaule is :
"
+
i);
6
return
true
;
//
獲得被執行的機會,但由于 finally 已經終止程序,返回值沒有機會被返回
7
}
catch
(Exception e)
{
8
System.out.println(
"
-- Exception --
"
);
9
return
true
;
10
}
finally
{
11
finallyMethod();
12
System.exit(
0
);
//
finally 中含有 System.exit() 語句,System.exit() 將退出整個程序,程序將被終止
13
}
14
}
15
后臺輸出結果:
1
2
i vaule is :
5
3
4
call finallyMethod and
do
something
--->>
5
5. 拋出 Exception,當 catch 和 finally 同時遇上 return,catch 的 return 返回值將不會被返回,finally 的 return 語句將結束整個方法并返回
1
2
public
static
boolean
finallyTest1()
{
3
try
{
4
int
i
=
10
/
0
;
//
拋出 Exception,后續處理被拒絕
5
System.out.println(
"
i vaule is :
"
+
i);
6
return
true
;
//
Exception 已經拋出,沒有獲得被執行的機會
7
}
catch
(Exception e)
{
8
System.out.println(
"
-- Exception --
"
);
9
return
true
;
//
Exception 已經拋出,獲得被執行的機會,但返回操作將被 finally 截斷
10
}
finally
{
11
finallyMethod();
12
return
false
;
//
return 將結束整個方法,返回 false
13
}
14
}
15
后臺輸出結果:
1
2
--
Exception
--
3
4
call finallyMethod and
do
something
--->>
false
5
6. 不拋出 Exception,當 finally 遇上 return,try 的 return 返回值將不會被返回,finally 的 return 語句將結束整個方法并返回
1
2
public
static
boolean
finallyTest2()
{
3
try
{
4
int
i
=
10
/
2
;
//
不拋出 Exception
5
System.out.println(
"
i vaule is :
"
+
i);
6
return
true
;
//
獲得被執行的機會,但返回將被 finally 截斷
7
}
catch
(Exception e)
{
8
System.out.println(
"
-- Exception --
"
);
9
return
true
;
10
}
finally
{
11
finallyMethod();
12
return
false
;
//
return 將結束這個方法,不會在執行完之后再跳回 try 或 catch 繼續執行,返回 false
13
}
14
}
15
后臺輸出結果:
1
2
i vaule is :
5
3
4
call finallyMethod and
do
something
--->>
false
5
結語:
(假設方法需要返回值)
java 的異常處理中,
在不拋出異常的情況下,程序執行完 try 里面的代碼塊之后,該方法并不會立即結束,而是繼續試圖去尋找該方法有沒有 finally 的代碼塊,
如果沒有 finally 代碼塊,整個方法在執行完 try 代碼塊后返回相應的值來結束整個方法;
如果有 finally 代碼塊,此時程序執行到 try 代碼塊里的 return 語句之時并不會立即執行 return,而是先去執行 finally 代碼塊里的代碼,
若 finally 代碼塊里沒有 return 或沒有能夠終止程序的代碼,程序將在執行完 finally 代碼塊代碼之后再返回 try 代碼塊執行 return 語句來結束整個方法;
若 finally 代碼塊里有 return 或含有能夠終止程序的代碼,方法將在執行完 finally 之后被結束,不再跳回 try 代碼塊執行 return。
在拋出異常的情況下,原理也是和上面的一樣的,你把上面說到的 try 換成 catch 去理解就 OK 了 *_*
posted on 2012-07-08 09:45
fancydeepin
閱讀(70174)
評論(9)
編輯
收藏
評論:
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2013-12-06 09:57 |
弱水
寫的非常好!清晰明了!
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2013-12-26 17:03 |
pierr
總結得好
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2015-04-03 12:02 |
newbee
頂,這篇把異常處理的很多種具體情況都列出來。學習了
以后也要像博主一樣積累各種細節,不斷提高
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?[未登錄] 2015-09-02 13:03 |
大大
如果catch里面沒有return,但程序被拋出了,該如何處理呢?
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2015-10-15 10:40 |
旺仔
@大大
如果有finally,就會在執行完catch之后去執行finally,如果沒有程序就結束了吧。
我推理的,沒有寫代碼驗證,如果你驗證了,告訴我一下哈
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2015-11-16 14:31 |
321
ew2e
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎? 2016-04-06 15:05 |
readme
寫的很好,很容易理解,已學習!!
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?[未登錄] 2016-04-22 15:59 |
大大
給樓主贊一個
回復
更多評論
#
re: java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?
2016-05-06 19:08 |
mage
挖墳了。。。搜異常再拋出時候搜到就進來看看。try catch就當做是一個另類的if else就好了。遇到異常就從try 切換到 catch里面,所以根本不會有兩個return都執行到的情況。。這個finnally中的是特殊情況了。
return時候和函數傳參數是一樣的,return對象時候,是return的引用,return基本數據類型時候,是基本數據類型的值的復制。
順序就是先try/catch的return,再finally的,finally中的return的值會覆蓋之前的值。
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
github
個人主頁
beanutil
jutil
jexcel
orc
隨筆分類
(8)
junit
maven(8)
隨筆檔案
(104)
2015年6月 (8)
2015年2月 (1)
2015年1月 (1)
2014年9月 (1)
2014年8月 (3)
2014年6月 (10)
2014年5月 (3)
2014年3月 (5)
2013年10月 (1)
2013年9月 (2)
2013年4月 (1)
2013年3月 (2)
2013年2月 (11)
2012年11月 (3)
2012年10月 (14)
2012年8月 (15)
2012年7月 (13)
2012年6月 (10)
最新隨筆
1.?maven 為測試環境、生產環境等不同環境打包
2.?maven 多模塊項目
3.?nexus 搭建 maven 私服
4.?maven 鏡像
5.?maven jetty 插件使用
6.?maven jdk 版本配置
7.?eclipse maven plugin 插件 安裝 和 配置
8.?maven 安裝
9.?ORCP : 從數據庫表到 java 對象生成的 eclipse 插件
10.?jexcel 讀寫EXCEL
11.?linux 系列
12.?spring mvc(2):請求地址映射(@RequestMapping)
13.?spring mvc(1):基礎入門
14.?Java 驗證碼、二維碼
15.?GXT —— TreePanel 組件(一)
搜索
積分與排名
積分 - 1461301
排名 - 15
最新評論
1.?re: Maven 手動添加 JAR 包到本地倉庫[未登錄]
剛安裝好的maven,倉庫里沒有jar包,如何添加jar包呢?
--Firefly
2.?re: java 建造者模式(Builder)
多謝,講的很清楚
--Nimo
3.?re: Maven 手動添加 JAR 包到本地倉庫
很好很強大, 完美的解決了我的問題。。。
--klose
4.?re: eclipse maven plugin 插件 安裝 和 配置
@fancydeepin
鏈接還是失效了啊
--菜鳥一號
5.?re: Maven 手動添加 JAR 包到本地倉庫[未登錄]
@呼吸~
你好,請問,怎么設置代理呢?
--paul
閱讀排行榜
1.?eclipse maven plugin 插件 安裝 和 配置(325790)
2.?Maven 手動添加 JAR 包到本地倉庫(199723)
3.?Lombok 安裝、入門 - 消除冗長的 java 代碼(154841)
4.?java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?(70174)
5.?maven jetty 插件使用(49082)
6.?JSP/Servlet 工作原理(43122)
7.?maven jdk 版本配置(40992)
8.?spring mvc(2):請求地址映射(@RequestMapping)(39570)
9.?二叉樹的深度優先遍歷與廣度優先遍歷 [ C++ 實現 ](31253)
10.?maven 多模塊項目(27895)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 fancydeepin
主站蜘蛛池模板:
精品久久久久久无码免费
|
国产综合精品久久亚洲
|
久久国产乱子免费精品
|
国产亚洲精品免费
|
亚洲成a人片在线不卡
|
久久噜噜噜久久亚洲va久
|
亚洲情侣偷拍精品
|
日韩精品视频免费在线观看
|
3d成人免费动漫在线观看
|
99在线热播精品免费99热
|
特黄特色大片免费
|
亚洲av成本人无码网站
|
亚洲熟女综合色一区二区三区
|
亚洲酒色1314狠狠做
|
久久国产精品亚洲一区二区
|
亚洲精品国偷自产在线
|
久久久青草青青国产亚洲免观
|
全亚洲最新黄色特级网站
|
免费观看毛片视频
|
在线观看免费宅男视频
|
成年女人18级毛片毛片免费
|
手机看黄av免费网址
|
国产高清不卡免费在线
|
黄色免费网站网址
|
免费h片在线观看网址最新
|
精品福利一区二区三区免费视频
|
91热久久免费精品99
|
久久久精品免费国产四虎
|
a级毛片在线免费
|
免费观看在线禁片
|
久久久久久AV无码免费网站
|
亚洲日韩欧洲无码av夜夜摸
|
中文字幕亚洲日韩无线码
|
亚洲色精品88色婷婷七月丁香
|
亚洲精品自在在线观看
|
亚洲AV无码乱码在线观看富二代
|
免费国产叼嘿视频大全网站
|
免费一级毛片在线播放视频
|
日本免费人成视频在线观看
|
18级成人毛片免费观看
|
成人免费视频77777
|