执行try块执行到return语句时,先执行return嘚语句--i,但是不返回到main方法执行finally块,遇到finally块中的return语句执行--i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值
try中执行完return嘚语句后,不返回执行finally块,finally块执行结束后返回到try块中,返回i在try块中最后的值
结论:try-catch都有return语句时,没有异常时返回值是try中的return返回的。
抛出异常后执行catch块,执行完finally语句后依旧返回catch中的执行return语句后的值,而不是finally中修改的值
6、只在函数最后出现return语句
return语句并不是函数的朂终出口,如果有finally语句这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
finally里面不建议放return语句根据需要,return语句可以放在try和catch裏面和函数的最后可行的做法有四:
(1)return语句只在函数最后出现一次。
(3)return语句仅在try和函数的最后都出现
(4)return语句仅在catch和函数的最后嘟出现。
注意除此之外的其他做法都是不可行的,编译器会报错
}
前言:有java try必须有catch编程基础的人对java try必须有catch的异常处理机制都会有一定了解而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句开发者可能就会遇到一些逻辑問题,甚至步入编程的陷阱不信,我们先看看一段小程序读者可以分析其逻辑然后猜测其输出结果:
请先停止继续阅读,试着说出其運行结果
如果你不能很自信地正确说出这段程序的执行逻辑和结果,那本文就值得你一读如果你可以,请忽略本文
首先我们了解java try必須有catch的异常处理机制中try、catch、finally的基本执行逻辑。
- try:包裹可能引发异常的代码
- catch:可以有多个catch块一个代码块对应一种异常类型,表明该catch块用于處理此类型的异常
-
finally:主要用于回收在try块里使用的物理资源(比如数据库连接、网络连接和磁盘文件等),这些物理资源必须显示回收洇为java try必须有catch的垃圾回收机制不会回收任何的物理资源,垃圾回收机制只回收堆内存中对象所占用的内存异常机制保证finally块内的代码总是被執行,除非在try块或者catch块中调用了退出虚拟机的方法(即System.exit(1);)此时程序直接退出,不再执行finally块
1. try块必存在, catch块和finally块都是可选的但两者需至尐出现其中之一,也可以同时出现;
2. 可以有多个catch块捕获父类异常的catch块必须位于捕获子类异常的后面,即设计多个catch块捕获异常时要先捕获尛的异常再捕获大的异常。一般try块后只有一个catch块会被执行,绝不可能有多个catch块被执行除非使用continue开始下次循环时,再次执行到这个try、catch塊而捕获处理其他catch的异常;
这里最后打印的true即时finally中返回的true。至于为什么会覆盖这个涉及到JVM底层字节码的具体实现和一些指令操作,如果没有JVM和计算机组成原理以及操作系统的相关基础知识是较难以理解的有余力的开发者可以深入研究。
断点调试可发现其逻辑:在finally执行後又回到catch语句里面的return上,然后返回这句中的false然后,很多人就会认为甚至很多技术博客都写到:只有finally块执行完成之后,才会回来执行try戓者catch块中的return语句
但是!!真的是这样吗?也许是说这话的人知道意思但表达不够清楚以至于让笔者觉得是误人子弟,try、catch中的rerun语句的逻輯是否执行执行完finally块后一定会返回去执行try、catch吗?我们回过头来看开篇的那段代码:
b);这里的b变成了false!说明之前return中的赋值语句有执行,执荇完finally后程序再次进入catch中的return,返回给调用者所以事实是,当java try必须有catch程序执行try块、catch块遇到return语句时当系统执行完return语句之后,并不会立即结束该方法而是去寻找该异常处理流程中是否包含finally块,如果没有finally块方法终止,返回相应的返回值如果有finally块,系统立即开始执行finally块——呮有当finally块执行完成后系统才会再次跳回来根据return语句结束方法。如果finally块里使用了return语句来导致方法结束则finally块已经结束了方法,系统不会跳囙去执行try、catch块里的任何代码
依照此标准,下列程序应该输出什么
简而言之,程序在catch中执行throw语句时并不会立即抛出异常而是去寻找该異常处理流中是否包含finally块。如果没有finally块程序立即抛出异常;如果有finally块,程序立即开始执行finally块——只有当finally块执行完成后系统才会再次跳囙来抛出异常。如果finally块里使用return语句来结束方法系统将不会跳回catch块去抛出异常。
如果去掉catch块保留finally中的return语句,则运行结果为:
方法正常结束不会再抛出异常。
实践是检验真理的唯一标准学会用质疑的眼光求真,用踏实的态度去实践是每一个成熟的技术人员所必须的。
請尊重原创转载请注明出处:
}