try-catch
是一个非常常见的处理异常的语法和操作。将异常进行捕获,根据需求执行相应处理异常的代码。不过大家有没有想过,在for
循环进行遍历的时候,应不应该try-catch
,应该的话又该放在哪里呢?有位同学就被面试官问了这么一个问题,但是如果简单回答怕是要被面试官说回去等消息了,下面我们一步步剖析这个问题~
首先,异常肯定是要被捕获的,不然代码可就出异常报错进行不下去了。
那么第二个问题来了:for
循环和try-catch
,应该谁在谁里面呢?
try-catch
语句在 for
循环里还是外面主要取决于我们希望如何处理异常,和不同语言之间没有根本差别,主要是编码风格和具体的异常处理需求。也就是没有什么在里面好和在外面好 或者不好的一说,纯看业务需求来定~
第一个场景:try-catch
在 for
循环外面
- 优点:
- 当你希望整个循环过程的异常能一次性捕获时使用。
- 提高代码清晰度,减少重复的异常处理代码。
- 缺点:
- 如果循环中某次迭代发生异常,后续的迭代不会继续执行,整个循环可能会被中断。
try {
for (int i = 0; i < 10; i++) {
// 可能抛出异常的代码
}
} catch (Exception e) {
// 处理异常
}
第二个场景:try-catch
在 for
循环里面
- 优点:
- 每次迭代都会捕获并处理异常,循环可以继续执行,后续的迭代不会因为某次异常而停止。
- 适合当你希望某次迭代的异常不影响整体流程时。
- 缺点:
- 增加了
try-catch
语句的执行频率,可能会略微影响性能。 - 异常处理逻辑可能会重复多次,降低代码可读性。
- 增加了
for (int i = 0; i < 10; i++) {
try {
// 可能抛出异常的代码
} catch (Exception e) {
// 处理异常
}
}
以上是使用场景的不同,在没有异常的情况下都没有差别。但是如果有异常出现时,那么性能上就会略有差别了。如果真的存在大批量业务处理全是异常,有那么一定的内存消耗情况。
我们可以简单来测试一下内存消耗情况
在 Java 中,可以通过 Runtime.getRuntime().freeMemory()
获取 JVM 中的可用内存,并通过多次运行不同场景下的代码来比较它们的内存消耗情况。
我们将进行两次测试,来比较在 for
循环中 try-catch
语句的内存消耗情况:
- 全不异常的情况
try-catch
包裹在for
循环中,每次循环没有抛出异常。
- 全异常的情况
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-catch
在 for
里面 和 外面 ,都是几乎没区别的。
为啥, 因为 异常try catch 其实一早编译完就标记了 如果从哪儿(from)出现异常,会直接去到(to)的那行代码去。
总的来说其实就是看业务。我需要出现异常就终止循环的,就放外头;
不需要终止循环,就搞里头。
欢迎关注公众号:“全栈开发指南针”
标签:try,代码,哪里,catch,循环,trycatch,runtime,异常 From: https://blog.csdn.net/m0_46580983/article/details/142481666
这里是技术潮流的风向标,也是你代码旅程的导航仪!