异常的注意事项

多个异常使用捕捉又该如何处理:
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);
    }
}