You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无限循环中用Try/Catch捕获OutOfMemoryError终止循环?

如何用Try/Catch捕获OutOfMemoryError终止Java无限循环?

问题根源分析

你当前的代码存在两个核心问题:

  1. 无限循环不会触发OutOfMemoryError:你的循环只是反复打印"hi",这种操作几乎不占用额外内存,永远不会触发内存溢出错误,自然不会进入异常处理逻辑。
  2. finally块无法终止循环:finally块只有在try块的执行流程结束后才会运行,而你的循环会无限执行,try块根本不会走到结束的位置,所以finally块完全不会被执行。

另外你的循环本身逻辑就有问题:初始i = length(比如数组长度为11),循环条件是i < length + 6(即17),每次循环i--,i会从11一直减到负数,永远满足i < 17,导致无限循环。

正确实现方案

要满足教授要求(捕获OutOfMemoryError终止循环),你需要让循环持续消耗内存直到触发内存溢出,再通过catch块捕获错误并终止流程。以下是修正后的代码:

public class Infinite {
    public static void main(String[] args) {
        // 用于持续占用内存的集合
        java.util.List<byte[]> memoryHog = new java.util.ArrayList<>();
        
        try {
            int[] myArray = {2, 6, 8, 1, 9, 0, 10, 23, 7, 5, 3};
            int length = myArray.length;
            int i = length;
            
            while (i < length + 6) {
                i--;
                System.out.println("hi");
                // 每次循环创建1MB大小的字节数组,快速消耗堆内存
                memoryHog.add(new byte[1024 * 1024]);
            }
        } catch (OutOfMemoryError e) {
            // 捕获内存溢出错误,执行终止逻辑
            System.out.println("捕获到OutOfMemoryError,终止循环");
            System.exit(0);
        } finally {
            System.out.println("finally块执行:无论是否出现异常,此代码都会运行");
        }
    }
}

额外说明

  • 若要快速触发OutOfMemoryError,可以在启动JVM时加上堆内存限制参数,例如-Xmx64m(将最大堆内存设为64MB),否则默认堆内存较大,可能需要很久才会触发错误。
  • 如果你只是想单纯终止无限循环(不需要触发内存溢出),直接修改循环条件即可,但根据教授要求,必须通过捕获OutOfMemoryError实现,所以内存消耗的逻辑是必要的。

内容的提问来源于stack exchange,提问作者commencer548

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:40:32