public static void main(String[] args) {
// System.out.println("0".charAt(0)-'0');//0
// System.out.println("".charAt(0)-'0');//String index out of range: 0
System.out.println(t(null)+","+t("0")+","+t(""));
}
public static int t(String str){
try{
return str.charAt(0)-'0';
}catch(NullPointerException e){
e.printStackTrace();
return 1;
}catch(StringIndexOutOfBoundsException e){
e.printStackTrace();
return 2;
}catch(Exception e){
e.printStackTrace();
return 3;
}finally{
System.out.println("finally");
return 4;
}
}
执行结果:
再把finally里的return 4;注释掉,测试结果:
结论:
(1)执行顺序(或优先级):try语句—>catch语句(如果报异常)—>finally语句—>finally里的return—>catch里的return—>try里的return
(2)try执行后,finally不一定执行,理由:
①try语句里有System.exit(0);语句
②当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。
③更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。