如何判断finally代码块的控制权来自try还是catch?
如何判断finally代码块的控制权来自try还是catch?
嘿,这个问题问得挺实用!答案是完全可以实现,不过Java本身并没有提供原生的API来直接判断,我们得自己手动加个标记变量来追踪控制权的走向。
具体思路很简单:
- 先定义一个标记变量(比如布尔类型),初始值设为
false,代表默认来自try块 - 如果代码触发异常进入了catch块,就把这个变量改成
true - 最后在finally块里,通过检查这个变量的值就能判断控制权来源了
给你写个完整的示例代码:
public class FinallyControlCheck { public static void main(String[] args) { boolean enteredCatch = false; // 标记是否进入过catch块 try { // 这里可以写你的业务代码,比如故意抛出异常测试: // throw new Exception("测试异常"); System.out.println("执行try块代码"); } catch (Exception e) { enteredCatch = true; // 进入catch块,修改标记 System.out.println("执行catch块代码"); } finally { if (enteredCatch) { System.out.println("finally的控制权来自catch块"); } else { System.out.println("finally的控制权来自try块"); } } } }
补充说明:
- 如果try块里执行了
return、break或者continue这类跳转语句,只要没有触发异常,enteredCatch还是false,finally会正确识别来自try块 - 如果有多个catch块,你可以把标记改成枚举类型或者字符串,来区分具体是哪个catch块触发的,比如:
enum ControlSource {TRY, CATCH_IO, CATCH_GENERAL} ControlSource source = ControlSource.TRY; // 在对应catch里设置source = ControlSource.CATCH_IO; 等等
内容的提问来源于stack exchange,提问作者ayushgp
相关产品推荐
相关产品推荐

