异常Exception

1.运行时异常:有一个共同的父类:RuntimeException

java.lang.ArithmeticException:算术运算异常

int a = 2;int b = 0;if (b != 0) {a = a / b;}

java.lang.NullPointerException:空指针异常

String str = null;
        if (str != null) {boolean f = str.equals("abc");}

java.lang.ArrayIndexOutOfBoundsException:数组下标越界异常。

int[] niArr = new int[2];
        int index = 0;
        if (index > 0 && index < niArr.length - 1) {
            niArr[index] = 2;}

java.lang.ClassCastException:类型转换异常。

Object obj = new String("abc");
        if (obj instanceof Integer) {
            Integer inte = (Integer) obj;}

java.lang.NumberFormatException:数字格式化异常。

String s = "abc";
        if (s.matches("\\d+")) {
            int i = Integer.parseInt(s);}

编译时异常/非运行时异常/检测异常:

1. throws:并没有真正的处理异常,只是骗过编译器。

a) 逐层的上抛异常,直到main方法。如果main中仍没有处理,程序会被异常中断。

b) throws中断了本层的代码。

c) throws运行时异常没有意义

要想积极的处理异常,用try-catch-finally:

try{// 出现1次
// 可能出现异常的代码
}catch(异常对象){// 出现0-N次 多次的时候小的写上面,大的写下面,异常时从上到下逐步的捕获的。
    // 捕获到对应异常对象之后所做的处理。
}finally{// 出现0-1次,没有catch时finally一定要有。
    // 一定会执行的代码
}
try{// //      
    可能会出现异常的代码
            // 多个catch语句时,小异常写上面,大异常写下面
        }catch(ArithmeticException ae){// 捕获try中抛出的异常。当try中抛出异常被捕获到时执行这里
            ae.printStackTrace();// 打印异常对象的堆栈信息

Throwable:可抛出的:

两个子类:Error Exception

throw 关键字,后跟异常对象,直接将异常对象抛出。

自定义异常:只能用throw抛出。分两步:

1. 继承自Exception或者Exception的子类。

2. 提供String做参数的构造,利用父类的String做参数的构造完成初始化,String内容用于对异常的描述。

注意重写时方法抛出异常的问题:

子类重写方法抛出的异常不能比父类的更宽泛(要么相同,要么更小)

练习:

自定义异常 AgeException

在person类中(name,age),setAge方法,如果不符合年龄的条件,抛出自定义的AgeException

Person类
public class Person {
    private String name;
    private int age;
    public Person() {
        super();
    }
    public Person(String name, int age) throws AgeException{
        super();
        this.setName(name);
        this.setAge(age);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) throws AgeException{
        if(age>120 || age<0){
            throw new AgeException("年龄不合法");
        }else{
            this.age = age;
        }
    }
    public static void main(String[] args) {
        try {
            Person p = new Person("zhangfei",30);
            System.out.println(p.getName());
        } catch (AgeException e) {
            e.printStackTrace();
        }
    }
}
AgeExpection  类
public class AgeException extends Exception{
    public AgeException(){
          
    }
    public AgeException(String s){
        super(s);
    }
}