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 組件(一)
搜索
積分與排名
積分 - 1461363
排名 - 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 插件 安裝 和 配置(325792)
2.?Maven 手動添加 JAR 包到本地倉庫(199723)
3.?Lombok 安裝、入門 - 消除冗長的 java 代碼(154841)
4.?java 異常捕捉 ( try catch finally ) 你真的掌握了嗎?(70174)
5.?maven jetty 插件使用(49084)
6.?JSP/Servlet 工作原理(43123)
7.?maven jdk 版本配置(40994)
8.?spring mvc(2):請求地址映射(@RequestMapping)(39572)
9.?二叉樹的深度優先遍歷與廣度優先遍歷 [ C++ 實現 ](31255)
10.?maven 多模塊項目(27896)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 fancydeepin
主站蜘蛛池模板:
亚洲精品无码久久久久去q
|
96免费精品视频在线观看
|
国产成人人综合亚洲欧美丁香花
|
亚洲AV无码成人精品区天堂
|
伊人婷婷综合缴情亚洲五月
|
浮力影院亚洲国产第一页
|
亚洲一区精品无码
|
亚洲精品~无码抽插
|
亚洲av中文无码乱人伦在线r▽
|
久久精品视频亚洲
|
亚洲综合一区二区国产精品
|
亚洲美女aⅴ久久久91
|
亚洲Av高清一区二区三区
|
亚洲综合一区无码精品
|
亚洲精品无AMM毛片
|
黄色a三级三级三级免费看
|
一边摸一边爽一边叫床免费视频
|
国产日韩在线视频免费播放
|
免费国产成人α片
|
国产成人精品免费视频网页大全
|
久久久久久免费视频
|
全免费一级午夜毛片
|
亚洲国产91精品无码专区
|
亚洲乱码国产一区三区
|
久久亚洲春色中文字幕久久久
|
久久久久se色偷偷亚洲精品av
|
亚洲精品永久在线观看
|
午夜肉伦伦影院久久精品免费看国产一区二区三区
|
亚洲一级毛片免费观看
|
成年女人毛片免费视频
|
免费一级毛片在级播放
|
亚洲啪啪综合AV一区
|
亚洲制服丝袜在线播放
|
苍井空亚洲精品AA片在线播放
|
亚洲入口无毒网址你懂的
|
色欲aⅴ亚洲情无码AV
|
国产中文字幕在线免费观看
|
亚洲免费福利视频
|
亚洲成av人片一区二区三区
|
亚洲va中文字幕无码久久
|
亚洲熟妇久久精品
|