在 Java 中,finally 本身不会导致死循环,但如果写法不当,确实可能造成“看起来像死循环”或真正的死循环。下面分情况说清楚。
finally 是什么finally 是 try-catch-finally 中的一部分,无论是否发生异常,都会执行(除非 JVM 退出)。
try {
// 可能抛异常
} catch (Exception e) {
// 处理异常
} finally {
// 一定执行
}
finally 不会“自动”死循环✅ 正常写法:
try {
return 1;
} finally {
System.out.println("finally");
}
输出:
finally
不会死循环。
finally 里调用会再次进入 finally 的方法(递归)public static void test() {
try {
System.out.println("try");
} finally {
test(); // 递归调用
}
}
❌ 结果:栈溢出(StackOverflowError)
看起来像“死循环”,但是是无限递归。
finally 里写 while(true)try {
// do something
} finally {
while (true) {
// 永远不退出
}
}
❌ 真正的死循环(不是 finally 的问题,是 while(true) 的问题)
finally 中再次抛出异常,外层又捕获并重新进入public static void main(String[] args) {
while (true) {
try {
throw new RuntimeException();
} finally {
System.out.println("finally");
}
}
}
❌ 这是 while(true) 造成的,不是 finally 本身。
finally 改变返回值(容易误解)public static int test() {
try {
return 1;
} finally {
return 2;
}
}
✅ 返回 2
❌ 不推荐这种写法,容易出 bug,但不是死循环
finally 不执行?finally 也可能“不执行”:
System.exit(0);
或:
finally本身不会造成死循环
死循环只可能来自:
finally 里的循环逻辑finally 里的递归如果你愿意,可以把你具体的代码发出来,我可以帮你判断是否真的会死循环。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。