首页 > 其他分享 >trycatch该在循环哪里

trycatch该在循环哪里

时间:2024-09-24 10:21:36浏览次数:13  
标签:try 代码 哪里 catch 循环 trycatch runtime 异常

在这里插入图片描述

try-catch是一个非常常见的处理异常的语法和操作。将异常进行捕获,根据需求执行相应处理异常的代码。不过大家有没有想过,在for循环进行遍历的时候,应不应该try-catch,应该的话又该放在哪里呢?有位同学就被面试官问了这么一个问题,但是如果简单回答怕是要被面试官说回去等消息了,下面我们一步步剖析这个问题~

在这里插入图片描述

首先,异常肯定是要被捕获的,不然代码可就出异常报错进行不下去了。

那么第二个问题来了:for循环和try-catch,应该谁在谁里面呢?

try-catch 语句在 for 循环里还是外面主要取决于我们希望如何处理异常,和不同语言之间没有根本差别,主要是编码风格和具体的异常处理需求。也就是没有什么在里面好和在外面好 或者不好的一说,纯看业务需求来定~

在这里插入图片描述

第一个场景:try-catchfor 循环外面

  • 优点:
    • 当你希望整个循环过程的异常能一次性捕获时使用。
    • 提高代码清晰度,减少重复的异常处理代码。
  • 缺点:
    • 如果循环中某次迭代发生异常,后续的迭代不会继续执行,整个循环可能会被中断。
try {
    for (int i = 0; i < 10; i++) {
        // 可能抛出异常的代码
    }
} catch (Exception e) {
    // 处理异常
}

第二个场景:try-catchfor 循环里面

  • 优点:
    • 每次迭代都会捕获并处理异常,循环可以继续执行,后续的迭代不会因为某次异常而停止。
    • 适合当你希望某次迭代的异常不影响整体流程时。
  • 缺点:
    • 增加了 try-catch 语句的执行频率,可能会略微影响性能。
    • 异常处理逻辑可能会重复多次,降低代码可读性。
for (int i = 0; i < 10; i++) {
    try {
        // 可能抛出异常的代码
    } catch (Exception e) {
        // 处理异常
    }
}

以上是使用场景的不同,在没有异常的情况下都没有差别。但是如果有异常出现时,那么性能上就会略有差别了。如果真的存在大批量业务处理全是异常,有那么一定的内存消耗情况。

我们可以简单来测试一下内存消耗情况

在 Java 中,可以通过 Runtime.getRuntime().freeMemory() 获取 JVM 中的可用内存,并通过多次运行不同场景下的代码来比较它们的内存消耗情况。

我们将进行两次测试,来比较在 for 循环中 try-catch 语句的内存消耗情况:

  1. 全不异常的情况
    • try-catch 包裹在 for 循环中,每次循环没有抛出异常。
  2. 全异常的情况
    • try-catch 包裹在 for 循环中,每次循环都抛出异常。
public class TryCatchMemoryTest {
    public static void main(String[] args) {
        // 获取 Runtime 实例
        Runtime runtime = Runtime.getRuntime();

        // 运行全不异常的情况
        runWithoutException(runtime);

        // 运行全异常的情况
        runWithException(runtime);
    }

    // 全不异常的情况
    private static void runWithoutException(Runtime runtime) {
        System.out.println("Test 1: 无异常");
        // GC,确保内存数据准确
        runtime.gc();
        long startMemory = runtime.freeMemory();

        for (int i = 0; i < 10000; i++) {
            try {
                // 正常的代码,不抛出异常
                int result = i * 2;
            } catch (Exception e) {
                // 不会执行
            }
        }

        long endMemory = runtime.freeMemory();
        System.out.println("无异常的内存消耗: " + (startMemory - endMemory) + " bytes");
    }

    // 全异常的情况
    private static void runWithException(Runtime runtime) {
        System.out.println("Test 2: 循环内全异常");
        // GC,确保内存数据准确
        runtime.gc();
        long startMemory = runtime.freeMemory();

        for (int i = 0; i < 10000; i++) {
            try {
                // 直接抛出异常
                throw new Exception("Test exception");
            } catch (Exception e) {
                // 捕获异常
            }
        }

        long endMemory = runtime.freeMemory();
        System.out.println("全异常的内存消耗: " + (startMemory - endMemory) + " bytes");
    }
}

如果说代码没出错的话,try-catchfor 里面 和 外面 ,都是几乎没区别的。

为啥, 因为 异常try catch 其实一早编译完就标记了 如果从哪儿(from)出现异常,会直接去到(to)的那行代码去。

总的来说其实就是看业务。我需要出现异常就终止循环的,就放外头;

不需要终止循环,就搞里头。

欢迎关注公众号:“全栈开发指南针”
这里是技术潮流的风向标,也是你代码旅程的导航仪!

标签:try,代码,哪里,catch,循环,trycatch,runtime,异常
From: https://blog.csdn.net/m0_46580983/article/details/142481666

相关文章

  • 爬虫到底难在哪里?
    如果你是自己做爬虫脚本开发,那确实难,因为你需要掌握Python、HTML、JS、xpath、database等技术,而且还要处理反爬、动态网页、逆向等情况,不然压根不知道怎么去写代码,这些技术和经验储备起码得要个三五年。比如这几个流程是必须的,初学者看着就很头疼。用户代理(User-Agent):模拟浏......
  • C语言分支语句和循环语句
     目录选择语句if-else语句if嵌套switch语句逻辑操作符!逻辑非&&逻辑与||  逻辑或循环语句while循环do-while循环for循环break和continue语句 break语句continue语句选择语句if-else语句if语句的语法形式if(表达式){语句}在C语言中非0为真,0为......
  • DS循环链表—约瑟夫环
    题目描述N个人坐成一个圆环(编号为1-N),从第S个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。例如:N=3,K=2,S=1。2号先出列,然后是1号,最后剩下的是3号。要求使用循环链表实现。输入测试数据有多组每组包括3个数N、K、S,表示有N个人,从第S个......
  • 【编程底层原理】彻底搞懂Spring是如何利用三级缓存来解决循环依赖问题的(一级缓存为
    一、整体推导思路为了彻底搞懂Spring是如何利用三级缓存来解决循环依赖问题的,要么去找三级缓存的设计者了解其设计的初衷,要么利用反推法来进行倒推(即一级缓存为啥不行,二级缓存为啥也不合适)。为了让大家能有一个更清晰的理解脉路,下面将先从反推法来介绍下一级缓存为啥不......
  • Python基于TensorFlow实现时间序列循环神经网络回归模型(LSTM时间序列回归算法)项目实
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景随着信息技术的发展和传感器设备的广泛应用,时间序列数据的产生量急剧增加。无论是股市价格的波动、电力消耗的趋势还是环境监测的数据变化,准确地预......