當咱們寫程序時遇到可能出現異常的地方咱們習慣用try catch增長程序的健壯性,可是try catch的位置呢,有時候咱們也是隨便放一個地方,只要程序不報錯就行,但是若是碰到循環的狀況呢?好比這個:java
public class Demo {
public static void func0(){
for(int i=0;i<1000;i++){
try {
System.out.println(1/0);
} catch (Exception e) {
System.out.println("i am exception");
}
}
}
}
給個人直觀感受是我必須把try catch移到外面:
public class Demo {
public static void func0(){
try {
for(int i=0;i<1000;i++){
System.out.println(1/0);
}
} catch (Exception e) {
System.out.println("i am exception");
}
}
}
由於我感受try catch放裏面貌似聲明瞭1000遍,性能差異可想而知,事實果然如此嗎?下面咱們就藉助java提供的反彙編工具
javap -c Xxx.class xxx.txt從指令級別來一探究竟!工具
1.javac Demo.java性能
2.javap -c Demo.class > xxx.txtspa
3.打開xxx.txtio
若是try catch放外面的話生成的指令信息爲:class
放裏面生成的指令信息爲:exception
能夠看到try catch放循環裏面的話,指令級別上並非多了1000多個try catch相關的指令,惟一的區別就是i<1000和syso(1/0)之間隔了try catch的指令,須要用goto跳轉一下而已,而這些區別能夠忽略不計,因此當不發生異常的時候try catch放循環內部和循環外部無所謂了,只有當發生異常時看你則麼處理異常了,這就和本文討論的無關了
循環
結論:程序
當循環內的代碼出現異常,須要結束循環時,將try代碼塊放在循環外;異常
當循環內的代碼出現異常,須要繼續執行循環時,將try代碼塊放在循環內。