Java异常时的返回值
2015-11-09 00:00
435 查看
摘要: 当Java程序异常时,我们的代码能给出一个正确的返回值是一件重要的事情,下面就用单步调试的方法简单的分析一下,Java异常时的各种返回值的情况。
先来看一个小程序:
首先来思考一个问题,当我们把注释1那一行也就是catch中的return 语句注释掉和不注释掉程序的输出最后的返回结果分别是什么?
如果不把catch中的return注释掉,返回结果是1,而注释掉catch中的return语句返回结果是3。
为什么呢?我们来调试一下程序,在抛出异常的地方也就是1/0那一行打上断点,然后debug。
我用的是eclipse,所以直接快捷键F6(跳过函数,把函数当做一个整体执行,不进入函数),直接跳到了catch,所以的确是1/0这里出了问题。
继续F6,直到catch中的return语句。
继续单步执行,发现直接跳过了return语句,继续执行finally语句块,继续F6单步执行,发现执行完finally块就直接执行catch块中的return了。
现在我们把catch块中的return语句注释掉来重新调试看一看程序是怎样执行的。
程序还是在1/0的地方抛出异常,然后执行catch块中的语句,再执行finally块中的语句。不过当catch块中没有return语句是,就会执行finally块后面的语句直到遇到return语句。
所以当catch中有return时,test()返回值是1,在catch块中没有return语句时,test()的返回值是3。
那么问题来了,为什么当catch中有return时test()的返回值是1,而不是2,finally中明明已经给i赋值为2了,为什么没有返回2。
在回答这个问题之前,我们先来了解一下java中两种退出方法的方式,
1. 遇到一个返回的指令(return语句)
2. 遇到一个异常,并且没有搜索到异常处理器,不会给调用返回任何值。
所以当catch中有return时,程序遇到return时就被标记了,finally块中只是执行最后的清理工作,如数据库连接的释放等。但是并不会修改return这个语句。
注意:不要在finally块中加入return语句,如果你在finally加入return就会改变你的return语句。如果你使用eclipse这样的IDE,当在finally中有return就会提醒你的代码不正常。
ps:eclipse中常用的调试快捷键的作用
F5(Step Into):就是单步进入,进入是指当代码遇到一个调用方法时进入调用方法的方法体中
F6(Step Over):单步跳过,就是当这一步是一个方法时就把它当做一个整体执行,不进入方法中
F7(Step Return):跳出,就是直接跳出当前正在执行的方法体,返回到调用
F8(Resume):重新开始,当执行到断点的时候,程序被挂起,F8的作用就是让程序继续执行,直到下一个断点重新被挂起
先来看一个小程序:
public class JavaException { public static void main(String[] args) { System.out.println(test()); } public static int test() { int i=0; try { i = 1/0;//抛出非受检异常 i=100; System.out.println("in try 抛出异常后不会执行到这里!"); } catch(Exception e) { i=1; System.out.println("in catch i="+i); return i; //注释1 } finally { i=2; System.out.println("in finally i="+i); } i=3; return i; } }
首先来思考一个问题,当我们把注释1那一行也就是catch中的return 语句注释掉和不注释掉程序的输出最后的返回结果分别是什么?
如果不把catch中的return注释掉,返回结果是1,而注释掉catch中的return语句返回结果是3。
为什么呢?我们来调试一下程序,在抛出异常的地方也就是1/0那一行打上断点,然后debug。
我用的是eclipse,所以直接快捷键F6(跳过函数,把函数当做一个整体执行,不进入函数),直接跳到了catch,所以的确是1/0这里出了问题。
继续F6,直到catch中的return语句。
继续单步执行,发现直接跳过了return语句,继续执行finally语句块,继续F6单步执行,发现执行完finally块就直接执行catch块中的return了。
现在我们把catch块中的return语句注释掉来重新调试看一看程序是怎样执行的。
程序还是在1/0的地方抛出异常,然后执行catch块中的语句,再执行finally块中的语句。不过当catch块中没有return语句是,就会执行finally块后面的语句直到遇到return语句。
所以当catch中有return时,test()返回值是1,在catch块中没有return语句时,test()的返回值是3。
那么问题来了,为什么当catch中有return时test()的返回值是1,而不是2,finally中明明已经给i赋值为2了,为什么没有返回2。
在回答这个问题之前,我们先来了解一下java中两种退出方法的方式,
1. 遇到一个返回的指令(return语句)
2. 遇到一个异常,并且没有搜索到异常处理器,不会给调用返回任何值。
所以当catch中有return时,程序遇到return时就被标记了,finally块中只是执行最后的清理工作,如数据库连接的释放等。但是并不会修改return这个语句。
注意:不要在finally块中加入return语句,如果你在finally加入return就会改变你的return语句。如果你使用eclipse这样的IDE,当在finally中有return就会提醒你的代码不正常。
ps:eclipse中常用的调试快捷键的作用
F5(Step Into):就是单步进入,进入是指当代码遇到一个调用方法时进入调用方法的方法体中
F6(Step Over):单步跳过,就是当这一步是一个方法时就把它当做一个整体执行,不进入方法中
F7(Step Return):跳出,就是直接跳出当前正在执行的方法体,返回到调用
F8(Resume):重新开始,当执行到断点的时候,程序被挂起,F8的作用就是让程序继续执行,直到下一个断点重新被挂起
相关文章推荐
- Linux 自检和 SystemTap
- Python 七步捉虫法
- 路由器的配置与调试
- 对于技术人员的出现了运行时间错误,是否要进行调试的解决方法
- 可以用来调试JavaScript错误的解决方案
- 如何调试异步加载页面里包含的js文件
- jQuery下的Ajax调试步骤
- 调试一段PHP程序时遇到的三个问题
- JavaScript高级程序设计 错误处理与调试学习笔记
- Javascript调试脚本的经验之谈第1/2页
- 在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
- Android App调试内存泄露之Cursor篇
- Lua的编译、执行和调试技术介绍
- 10个调试和排错的小建议
- 调试PHP程序的多种方法介绍
- PHP调试函数和日志记录函数分享
- Visual Studio调试技巧汇总
- JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
- JavaScript 错误处理与调试经验总结
- 解析使用ThinkPHP应该掌握的调试手段