例题:如下代码,请问控制台输出和返回值是什么
public int test(){
try {
Integer[] a={1,2,3};
List<Integer> list= Arrays.asList(a);
list.add(4);
System.out.println(0);
return 0;
}catch (Exception e){
System.out.println(1);
}finally {
System.out.println(2);
return 2;
}
}
考点:
-1. 数组越界问题
数组a大小为3,往数组里面添加新的元素时,会越界,抛出异常
-2.try catch finally
一.基本概念:
try{
//try代码块的内容为要执行的代码,其中可能会有异常
}catch{
//try代码块发现异常跳转到catch,否则不执行catch块
}finally{
//无论什么情况下都会执行finally中的内容
}
二.注意事项:
- 1.异常处理块中只有try是必须的,没有try也没有后面的catch和finally
2.catch和finally可以只有一个,也可以同时出现,但是不能同时没有 ps. try finally的组合通常会导致异常丢失,不常见
3.可以有多个catch块,捕获父类异常的块必须在子类后面
4.catch必须在try后面,finally必须在catch后面
三.try catch finally return 的执行顺序
public int test(){
int c=0;
try {
Integer[] a={1,2,3};
List<Integer> list= Arrays.asList(a);
list.add(4);
System.out.println("无异常");
return c++;
//无异常时,该return会执行,但不会返回,最终会返回finally中的return
}catch (Exception e){
System.out.println("有异常");
return ++c;
}finally {
System.out.println("最终");
return ++c;
//把return去掉,改成c++会出现什么情况
//假设无异常,return返回c++,此时renturn的值就会被保存,即使finally中对c的值进行改变,也不会影响return的值。
}
}
总结:
- 若finally中有return语句,则无论是否有异常,try catch中是否有return,最终返回值都是finally中return的值
- finally中没有return,则返回的是try/catch中的return语句
- 假设return的是变量(finally中没有return语句),最终返回的值不会受finally中的语句的影响,返回值在执行完try/catch后就会被保存,不受finally的影响,但finally可以改变该变量的值。