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

trycatch该在循环哪里

时间:2024-09-24 10:21:36浏览次数:3  
标签: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个......
  • 双链表和循环链表
    线性表的链式和线性存储见前两篇文章一、双链表1.定义:在线性表的链式存储结构中,每个物理结点增加一个指向后继结点的指针域和一个指向前驱结点的指针域2.优点:(1)从任一结点出发可以快速找到其前驱结点和后继结点(2)从任一结点出发可以访问其他结点注意:双链表的密度比单链表......
  • Spring 的循环依赖
    在Spring中,循环依赖是指两个或多个Bean相互依赖,导致在创建过程中出现了依赖死锁的问题。为了解决循环依赖,Spring引入了三级缓存机制。了解为什么需要三级缓存机制,首先要明白循环依赖是如何发生的,以及两级缓存为什么不足够。一、循环依赖是什么?假设有两个BeanA和B:A......
  • 帝国cms的数据库用户名在哪里
    帝国CMS的数据库用户名通常是在安装时设置的,并且在安装完成后会保存在配置文件中。具体来说,数据库用户名和其他数据库连接信息会存储在帝国CMS的配置文件里。以下是帝国CMS不同版本中配置文件的位置:对于帝国CMS7.0及之后的版本:  /e/config/config.php对于帝国CMS......
  • 【编程底层原理】彻底搞懂Spring是如何利用三级缓存来解决循环依赖问题的(一级缓存为
    一、整体推导思路为了彻底搞懂Spring是如何利用三级缓存来解决循环依赖问题的,要么去找三级缓存的设计者了解其设计的初衷,要么利用反推法来进行倒推(即一级缓存为啥不行,二级缓存为啥也不合适)。为了让大家能有一个更清晰的理解脉路,下面将先从反推法来介绍下一级缓存为啥不......
  • Python基于TensorFlow实现时间序列循环神经网络回归模型(LSTM时间序列回归算法)项目实
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景随着信息技术的发展和传感器设备的广泛应用,时间序列数据的产生量急剧增加。无论是股市价格的波动、电力消耗的趋势还是环境监测的数据变化,准确地预......
  • 视频号直播自动循环发评论-自动回复评论 - 浏览器插件
    功能介绍浏览器插件源码开放,可以随意二次开发,无时间限制,无账号限制,无电脑限制实现原理,纯浏览器插件实现,监控浏览器界面元素变动,获取直播间或者直播中控后台的评论文本,匹配回复关键词或调用AI接口,再利用js模拟输入和点击等操作支持以下中控台或直播间地址,获取评论与回复评论抖......
  • 代码日数:高级循环
    2024年8月30日星期五我目前正在学习codecademy全栈工程师路径的第二门课程。我最近完成了javascript语法i课程,并完成了javascript语法ii中的数组和循环作业。接下来是对象、迭代器、错误和调试、练习以及三个挑战项目。今天的主要亮点是学习对我来说全新的循环,即f......