⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/qq_35387940/article/details/128406626 「小目标青年」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

前言

有个老哥昨天被面试官欺负了,但是是被这个问题(标题)欺负的?

其实是个比较基础的问题,只要有了解过,叙述是非常简单OK的。

正文

首先 , 话说在前头,

没有什么 在里面 好 和在外面好 或者 不好的 一说。

本篇文章内容:

  1. 使用场景
  2. 性能分析
  3. 个人看法

1. 使用场景

为什么要把 使用场景 摆在第一个 ?

因为本身try catch 放在 for循环 外面 和里面 ,如果出现异常,产生的效果是不一样的。

怎么用,就需要看好业务场景,去使用了。

① try catch 在 for 循环 外面

代码示例 :

public static void tryOutside() {
try {
for (int count = 1; count <= 5; count++) {
if (count == 3) {
//故意制造一下异常
int num = 1 / 0;
} else {
System.out.println("count:" + count + " 业务正常执行");
}
}
} catch (Exception e) {
System.out.println("try catch 在for 外面的情形, 出现了异常,for循环显然被中断");
}
}

结果:

效果结论:

try catch 在 for 循环 外面 的时候, 如果 for循环过程中出现了异常, 那么for循环会终止。

② try catch 在 for 循环 里面

代码示例 :

public static void tryInside() {
for (int count = 1; count <= 5; count++) {
try {
if (count == 3) {
//故意制造一下异常
int num = 1 / 0;
} else {
System.out.println("count:" + count + " 业务正常执行");
}
} catch (Exception e) {
System.out.println("try catch 在for 里面的情形, 出现了异常,for循环显然继续执行");
}
}
}

结果:

效果结论:

try catch 在 for 循环 里面 的时候, 如果 for循环过程中出现了异常,异常被catch抓掉,不影响for循环 继续执行。

ps:

在面试的时候,如果真的连上面这个在外面在里面使用效果都没说对,那,真的会去等通知了。

但是 之前不会的看官,看完这一篇, 肯定会了。

2. 性能

时间上, 其实算是无差别。

内存上, 如果没出异常,其实也是无差别。

但是如果出现了异常, 那就要注意了。

注意点是什么 ? 看代码:

我们简单用

Runtime runtime = Runtime.getRuntime();
long memory = runtime.freeMemory();

来统计一下内存消耗情况:

结论:

也就是说, try catch 放在 for 循环里面 ,因为出现异常不会终止 for循环。所以如果真的存在大批量业务处理全是异常,有那么一定的内存消耗情况。

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

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

  • Exception table : 当前函数程序代码编译涉及到的异常;
  • type :异常类型;
  • target:表示异常的处理起始位;
  • from:表示 try-catch 的开始地址;
  • to:表示 try-catch 的结束地址;

所以如果不考虑业出错,是否终止循环, 这个try catch 放里放外没啥区别。

3. 个人看法

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

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

但是要注意一点就是,别在for循环里面去 查库调用第三方啥的,这些操作,如果必要,需要慎重考虑了。(别什么都搞里头!!!)

文章目录
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 1. 使用场景
      1. 2.1.0.1. ① try catch 在 for 循环 外面
      2. 2.1.0.2. ② try catch 在 for 循环 里面
  3. 2.2. 2. 性能
  4. 2.3. 3. 个人看法