1.場(chǎng)景描述
項(xiàng)目中,有遇到這種異常場(chǎng)景:在一個(gè)循環(huán)中,某一次出現(xiàn)了異常,但是希望程序捕獲異常處理后,繼續(xù)執(zhí)行下去。
這種怎么處理呢?
2.處理方式
2.1錯(cuò)誤方式
try-catch包裹住整個(gè)循環(huán):
@Test
public void testException1() {
try {
for (int i = 0; i < 15; i++) {
// i = 10時(shí),制造一個(gè)算術(shù)異常
if (i == 10) {
int j = i / 0;
}
System.out.println("第" + i + "次:" + i);
}
} catch (ArithmeticException e) {
logger.info("發(fā)生算術(shù)異常....");
}
}
執(zhí)行結(jié)果:
第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 - 發(fā)生算術(shù)異常....
Process finished with exit code 0
可以看到:
try-catch包裹住整個(gè)循環(huán)的話,盡管catch語(yǔ)句塊中沒(méi)有拋出異常(拋出異常會(huì)終止程序),只是打印日志,
但是程序依然會(huì)在發(fā)生異常的地方終止。
這種方式,并沒(méi)有起到讓程序在catch異常后繼續(xù)執(zhí)行的作用。
2.2正確方式
try-catch只包裹住可能出問(wèn)題的代碼(本例中就是 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("發(fā)生算術(shù)異常....");
}
System.out.println("第" + i + "次:" + i);
}
}
運(yùn)行結(jié)果:
第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 - 發(fā)生算術(shù)異常....
第10次:10
第11次:11
第12次:12
第13次:13
第14次:14
可以看到:
try-catch只包裹住循環(huán)體內(nèi)可能出問(wèn)題的代碼的話,若該部分出現(xiàn)異常,catch語(yǔ)句塊處理后,仍然可以往下繼續(xù)執(zhí)行try-catch后面的語(yǔ)句。
3.小結(jié)
處理循環(huán)中可能出現(xiàn)的異常時(shí),try-catch的使用范圍應(yīng)該盡量小。
只用try-catch包裹住可能出異常的部分(如算術(shù)運(yùn)算、日期轉(zhuǎn)化等)