1.场景描述
项目中,有遇到这种异常场景:在一个循环中,某一次出现了异常,但是希望程序捕获异常处理后,继续执行下去。
这种怎么处理呢?
2.处理方式
2.1错误方式
try-catch包裹住整个循环:
@Test
public void testException1() {
try {
for (int i = 0; i < 15; i++) {
// i = 10时,制造一个算术异常
if (i == 10) {
int j = i / 0;
}
System.out.println("第" + i + "次:" + i);
}
} catch (ArithmeticException e) {
logger.info("发生算术异常....");
}
}
执行结果:
第0次:0
第1次:1
第2次:2
第3次:3
第4次:4
第5次:5
第6次:6
第7次:7
第8次:8
第9次:9
00:07:19.091 [main] INFO cn.no7player.service.UserService - 发生算术异常....
Process finished with exit code 0
可以看到:
try-catch包裹住整个循环的话,尽管catch语句块中没有抛出异常(抛出异常会终止程序),只是打印日志,
但是程序依然会在发生异常的地方终止。
这种方式,并没有起到让程序在catch异常后继续执行的作用。
2.2正确方式
try-catch只包裹住可能出问题的代码(本例中就是 if (i=10) 这里)
@Test
public void testException2() {
for (int i = 0; i < 15; i++) {
try {
if (i == 10) {
int j = i / 0;
}
} catch (ArithmeticException e) {
// throw new Exception("除0异常");
logger.info("发生算术异常....");
}
System.out.println("第" + i + "次:" + i);
}
}
运行结果:
第0次:0
第1次:1
第2次:2
第3次:3
第4次:4
第5次:5
第6次:6
第7次:7
第8次:8
第9次:9
00:22:57.602 [main] INFO cn.no7player.service.UserService - 发生算术异常....
第10次:10
第11次:11
第12次:12
第13次:13
第14次:14
可以看到:
try-catch只包裹住循环体内可能出问题的代码的话,若该部分出现异常,catch语句块处理后,仍然可以往下继续执行try-catch后面的语句。
3.小结
处理循环中可能出现的异常时,try-catch的使用范围应该尽量小。
只用try-catch包裹住可能出异常的部分(如算术运算、日期转化等)
网友评论