异常的注意事项
多个异常使用捕捉又该如何处理:
1.多个异常分别处理
2.多个异常一次捕获,多次处理
3.多个异常一次捕获一次处理
多个异常分别处理
public class moreException {
public static void main(String[] args) {
try {
int[] arr={1,2,3};
System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println(e);
}
try {
List<Integer> list = List.of(1, 2, 3);
System.out.println(list.get(3));
}catch (IndexOutOfBoundsException e){
System.out.println(e);
}
System.out.println("后续代码");
}
}
/*java.lang.ArrayIndexOutOfBoundsException: 3
java.lang.IndexOutOfBoundsException: Index 3 out-of-bounds for length 3
后续代码*/
多个异常一次捕获,多次处理
注意:只会弹出抛出的第一个异常
public class moreException {
public static void main(String[] args) {
try {
int[] arr={1,2,3};
System.out.println(arr[3]);
List<Integer> list = List.of(1, 2, 3);
System.out.println(list.get(3));
}catch (ArrayIndexOutOfBoundsException e){
System.out.println(e);
}catch (IndexOutOfBoundsException e){
System.out.println(e);
}
System.out.println("后续代码");
}
}//java.lang.ArrayIndexOutOfBoundsException: 3
//后续代码
注意事项:catch里边定义的异常变量,如果有子父类关系,那么子类的异常变量必须写在上面,否则会报错。 ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException
多个异常一次捕获一次处理
要点:只写一个catch语句,里面是其他异常变量的超类
public class moreException {
public static void main(String[] args) {
try {
int[] arr={1,2,3};
System.out.println(arr[3]);
List<Integer> list = List.of(1, 2, 3);
System.out.println(list.get(3));
}catch (IndexOutOfBoundsException e){
System.out.println(e);
}
System.out.println("后续代码");
}
}
-
运行时异常被抛出考科一不处理,既不捕获也不声明抛出。
-
如果finally中有return语句,永远返回finally中的结果,要避免该情况。
-
如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类,或者不抛出异常。
-
父类没有抛出异常,子类重写父类该方法是也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
-
在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
public class Fu {
public void show01() throws NullpointerException,classcastException{}
public void show02() throws IndexoutOfBoundsException{}
public void show03() throws IndexOutOfBoundsException{}
public void show04(){}
class zi extends Fu{
//子类重写父类方法时,抛出和父类相同的异常
public_void show01() throws NullPointerException,classcastException{}
//子类重写父类方法时,抛出父类异常的子类
public void show02() throws ArrayIndexoutOfBoundsException{}
//子类重写父类方法时,不抛出异常
public void showe3(){}
/*父类没有抛出异常,子类重写父类该方法是也不可抛出异常。*/
public void show04()
/*此时子类产生该异常,只能捕获处理,不能声明抛出*/
public void show(){
try{
throw new Exception("编译期异常");
}catch(Exception e){
e.printStackTrace();
}
}
}
自定义异常
格式:
public class XXXException extends Exception / RuntimeException{
添加一个空参的构造方法
添加一个带异常信息的构造方法
}
注意:
1.自定义异常类一般都是一Exception结尾,说明该类是一个异常类
2.自定义异常类,必须继承Exception或者RuntimeException
继承Exception:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须
处理这个异常,要么throws,要么try...catch
继承RuntimeException:那么自定义的异常类就是一个运行期异常,无需处理,交给JVM处理(中断处理)
public class MakeException extends Exception{
//添加一个空参的构造方法
public MakeException(){
super();
}
/*添加一个带异常信息的构造方法
查看源代码发现,所有的异常类都会有一个带异常信息的构造方法,方法内部会调用父类带异常信息
的构造方法,让父类来处理这个异常信息。*/
public MakeException(String message){
super(message);
}
}