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
主站蜘蛛池模板:
日日噜噜噜噜夜夜爽亚洲精品
|
亚洲精品国产福利片
|
免费在线观看一级毛片
|
在线v片免费观看视频
|
www.999精品视频观看免费
|
国产精品视频免费观看
|
中文字幕乱码免费视频
|
91在线视频免费看
|
成人a视频片在线观看免费
|
在线观看免费大黄网站
|
国产a级特黄的片子视频免费
|
免费在线观影网站
|
免费91最新地址永久入口
|
亚洲精品国产福利在线观看
|
内射干少妇亚洲69XXX
|
亚洲免费日韩无码系列
|
国产亚洲AV夜间福利香蕉149
|
欧洲精品成人免费视频在线观看
|
成全高清视频免费观看
|
看全色黄大色大片免费久久
|
久久国产色AV免费看
|
1000部啪啪未满十八勿入免费
|
AV大片在线无码永久免费
|
蜜桃精品免费久久久久影院
|
亚洲AV无码一区二区三区国产
|
亚洲中文字幕无码一久久区
|
一区二区三区亚洲
|
亚洲日韩中文字幕一区
|
日韩毛片免费一二三
|
男男gay做爽爽的视频免费
|
国产精品高清免费网站
|
日韩精品无码免费一区二区三区
|
国产无遮挡又黄又爽免费网站
|
日本视频免费高清一本18
|
成av免费大片黄在线观看
|
无码国产精品一区二区免费式芒果
|
国产卡二卡三卡四卡免费网址
|
日韩免费毛片视频
|
亚洲日韩一页精品发布
|
亚洲麻豆精品果冻传媒
|
亚洲精品高清国产麻豆专区
|