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
阅读(70138)
评论(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新闻
知识库
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 组件(一)
搜索
积分与排名
积分 - 1459441
排名 - 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 插件 安装 和 配置(325693)
2. Maven 手动添加 JAR 包到本地仓库(199568)
3. Lombok 安装、入门 - 消除冗长的 java 代码(154801)
4. java 异常捕捉 ( try catch finally ) 你真的掌握了吗?(70138)
5. maven jetty 插件使用(49019)
6. JSP/Servlet 工作原理(43088)
7. maven jdk 版本配置(40957)
8. spring mvc(2):请求地址映射(@RequestMapping)(39521)
9. 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ](31203)
10. maven 多模块项目(27831)