其实这个问题的答案不是说放在里面或者外面就一定更好,或者说哪个不好。这需要结合具体的使用场景来回答。
使用场景
因为 try-catch 放在 for 循环外面或里面,在发生异常时会有不同的效果。所以需要结合具体的业务场景来考虑。
将 try-catch 放在 for 循环外面
代码示例:
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.");
}
}
输出:
success,count:1
success,count:2
An exception occurs.
很明显,当 try-catch 放在 for 循环外面时,如果 for 循环中发生异常,那么 for 循环将会终止。
将 try-catch 放在 for 循环里面
代码示例:
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.");
}
}
}
输出:
success,count:1
success,count:2
An exception occurs.
success,count:4
当 try-catch 在 for 循环里面时,如果 for 循环中发生异常,异常会被 catch 捕获,不会影响 for 循环的继续执行。
如果在面试中,连上面提到的放在外面或里面的使用效果都没搞清楚,那真的可以等通知了。接下来,咱们讨论一下性能方面的差异。
性能
在时间方面,实际上没有区别。在内存使用方面,如果没有异常,也没有区别。但如果发生异常,那就需要注意了。需要注意什么呢?看下面的代码:
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");
}
}
输出:
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 循环里面和外面几乎没有区别。
该文章在 2024/12/25 16:13:50 编辑过