try{
statement1;
}
catch(ExceptionType1 e1){
statement2;
} catch(ExceptionType2 e2){
statement3;
}finally{
statement4;
}
情况讨论:
- 1,statement1 抛出异常e,如果e是e1类型或子类型,那么就会进入 statement2,不会进入 statement3,如果 statement2 含return,那么会先进入finally,再执行return(如果statement4中含return,那么只会执行这个return);
测试代码:
public static String test001(int a) {
try {
if(a==1){
throw new Exception();
}
return "try block";
} catch (Exception e) {
System.out.println(" catch block");
return "catch return";
} finally {
System.out.println(" finally block");
return " finally return";
}
}
public static void main(String[] args) {
System.out.println("main:"+test001(1));
}
输出:
- 未抛出异常,如果statement1 有return,那么先进入finally再进入statement1的return (如果finally 有return 那么只能进入finally的return)
测试代码:
public class TryCatch {
public static void main(String[] args) {
System.out.println("main:" + test002());
}
public static String test002() {
try {
return "try block";
} catch (Exception e) {
System.out.println(" catch block");
} finally {
System.out.println(" finally block");
// return " finally return";
}
return "result";
}
}
效果:finally不含return
finally 含return:
总结
- try 通常与catch连用,但是并不一定需要与catch连用
可以是try{}finally{} - try {}catch(){ExceptionType1 e1}catch(ExceptionType e2){},如果抛出的异常不是ExceptionType1类型或者其子类型,那么就交给下一个catch处理(继续判断类型)
- return 只会执行一次.如果finally有return,那么只会执行这个return
- finally 中没有return,try 或者catch有return,那么需要先执行try,catch,然后finally,最后执行对应的return