1.多个异常使用捕获又该如何处理?
-
1.多个异常多次捕获,分开处理
-
2.多个异常一次捕获,分开处理
- 注意事项:
- catch里边定义的异常变量,子类的异常变量必须写在上边,否则会报错
- 原因:
例如:ArrayIndexOutOfBoundsException是IndexOutOfBoundsException的子类,此处写在啦下边,出现啦报错!!!
-
3.多个异常一次捕获,一次处理
- 让catch里定义的变量可以接收所有的异常即可—直接写Exception即可
-
捕获处理的好处:后续代码会被打印
2.三种示例:
//1.多个异常多次捕获,分开处理
try {
int[]arr={1,2,3};
System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
try {
List<Integer>list=new LinkedList<>();
list.add(1);
list.add(2);
System.out.println(list.get(3));
}catch (IndexOutOfBoundsException e){
e.printStackTrace();
}
}
数组越界,下标越界都有打印
2.多个异常一次捕获,分开处理
try {
int[]arr={1,2,3};
System.out.println(arr[3]);
List<Integer>list=new LinkedList<>();
list.add(1);
list.add(2);
System.out.println(list.get(3));
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
catch (IndexOutOfBoundsException e){
e.printStackTrace();
}
因try代码块里异常后边的代码不会被执行,这里数组先越界,所以只打印啦数组越界
//多个异常一次捕获,一次处理
//此处IndexOutOfBoundsException 是ArrayIndexOutOfBoundsException的父类,所以也可以接收它的异常对象
try {
int[]arr={1,2,3};
System.out.println(arr[3]);
List<Integer>list=new LinkedList<>();
list.add(1);
list.add(2);
System.out.println(list.get(3));
}catch (IndexOutOfBoundsException e){
e.printStackTrace();
}
}
3.注意: 以上的所有代码示例均为运行期异常,我们其实完全没必要处理,交给JVM处理即可,在这里只是方便大家的理解.
4.finally中return的使用
- 如果finally有return,永远返回finally中的结果,应避免这种情况
public class Demo07Finally {
public static void main(String[] args) {
int a=getA();
System.out.println(a);
}
private static int getA() {
int a=10;
try {
return a;
}catch (Exception e){
e.printStackTrace();
}finally {
a=100;
return a;
}
}
}
可以看到,程序的运行结果不是10,而是100,因为finally代码块里的程序总会被执行到,我们应避免这种情况.
5.字符类异常
- 如果父类抛出多个异常,子类重写父类的方法时抛出和父类相同的异常/父类异常的子类/不抛出异常
- 父类没有抛出异常,子类也不可抛出异常。此时,若子类方法产生异常,只能捕获处理
注意: 父类什么异常,子类就什么异常