try-catch应该写在for循环里面还是外面?

其实这个问题的答案不是说放在里面或者外面就一定更好,或者说哪个不好。这需要结合具体的使用场景来回答。

使用场景

因为 try-catch 放在 for 循环外面或里面,在发生异常时会有不同的效果。所以需要结合具体的业务场景来考虑。

将 try-catch 放在 for 循环外面

代码示例:

csharp 复制代码
public static void outside() {
    try {
        for (int count = 1; count <= 4; count++) {
            if (count == 3) {
                // 故意制造一个异常
                int num = count / 0;
            } else {
                System.out.println("success,count:" + count);
            }
        }
    } catch (Exception e) {
        System.out.println("An exception occurs.");
    }
}

输出:

makefile 复制代码
success,count:1
success,count:2
An exception occurs.

很明显,当 try-catch 放在 for 循环外面时,如果 for 循环中发生异常,那么 for 循环将会终止。

将 try-catch 放在 for 循环里面

代码示例:

csharp 复制代码
public static void tryInside() {
    for (int count = 1; count <= 4; count++) {
        try {
            if (count == 3) {
                // 故意制造一个异常
                int num = count / 0;
            } else {
                System.out.println("success,count:" + count);
            }
        } catch (Exception e) {
            System.out.println("An exception occurs.");
        }
    }
}

输出:

makefile 复制代码
success,count:1
success,count:2
An exception occurs.
success,count:4

当 try-catch 在 for 循环里面时,如果 for 循环中发生异常,异常会被 catch 捕获,不会影响 for 循环的继续执行。

如果在面试中,连上面提到的放在外面或里面的使用效果都没搞清楚,那真的可以等通知了。接下来,咱们讨论一下性能方面的差异。

性能

在时间方面,实际上没有区别。在内存使用方面,如果没有异常,也没有区别。但如果发生异常,那就需要注意了。需要注意什么呢?看下面的代码:

csharp 复制代码
public class TryCatchDemo {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        long startMemory = runtime.totalMemory() - runtime.freeMemory();
        for (int i = 0; i < 100000; i++) {
            try {
                if (i > 2) { 
                    // 如果这批数据有问题,全部都是异常情况
                    // 这意味着将近 10 万个异常将会被抛出
                    int num = i / 0; 
                } else {
                    System.out.println("success,i:" + i);
                }
            } catch (Exception e) {
                System.out.println("An exception occurs.");
            }
        }
        long endMemory = runtime.totalMemory() - runtime.freeMemory();
        long memoryUsed = endMemory - startMemory;
        System.out.println("memoryUsed:" + memoryUsed + "byte");
    }
}

输出:

erlang 复制代码
An exception occurs.
An exception occurs.
An exception occurs.
An exception occurs.
An exception occurs.
An exception occurs.
memoryUsed:11507104byte

可以看出,当 try-catch 放在 for 循环里面时,由于异常不会终止 for 循环。所以如果真的有大量业务流程都会发生异常的场景,那么它会在短时间内消耗大量内存。如果代码异常不多,try-catch 放在 for 循环里面和外面几乎没有区别。

相关推荐
DongQiShanRen26 分钟前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
cpolar技术支持1 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
高频因子挖掘机1 小时前
批量行情返回后,怎样把请求失败的股票单独挑出来?
后端·github·api
wuminyu1 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
小蒜学长1 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔1 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
殷色玫瑰2 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同2 小时前
java输入输出+方法
java·开发语言·python
Yyyyyy~2 小时前
【Java】String
java
我的div丢了肿么办2 小时前
go语言中管道 channel的使用
后端·go