1. Throwable 类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。<br /> Throwable类有两个直接子类:<br /> Exception:出现的问题是可以被捕获的;<br /> Error:系统错误,通常由JVM处理。

一、异常的分类


2、异常类Throwable - 图1

  1. Exception又包含了运行时异常(RuntimeException, 又叫非检查异常)和非运行时异常(又叫检查异常)
  2. Error是程序无法处理了, 如果OutOfMemoryError、OutOfMemoryError等等, 这些异常发生时, java虚拟机一般会终止线程。
  3. 运行时异常都是RuntimeException类及其子类,如 NullPointerException、IndexOutOfBoundsException等, 这些异常是不检查的异常, 是在程序运行的时候可能会发生的, 所以程序可以捕捉, 也可以不捕捉. 这些错误一般是由程序的逻辑错误引起的, 程序应该从逻辑角度去尽量避免。
  4. 检查异常是运行时异常以外的异常, 也是Exception及其子类, 这些异常从程序的角度来说是必须经过捕捉检查处理的, 否则不能通过编译. 如IOException、SQLException等。

    二、RuntimeException常见的异常有哪些

    1. NullPointerException - 空指针引用异常

    当应用程序试图在需要对象的地方使用 null 时,抛出该异常

    什么场景会出现:

  5. 调用null对象的方法。

  6. 访问或修改null对象的域。
  7. 如果null是一个数组,并获取null的长度。
  8. 如果null对象是一个对象数组,并访问会修改null对象的子元素
  9. 试图对null对象同步。

    2. classnotfoundexception

    解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可。
    

    什么场景会出现:

  10. 是否使用了重复的类库,且版本不一致,导致低版本被优先使用

  11. 类名错了,在调用class类中的forname方法时会出异常,很明显,我的是在调用classloader的loadclass方法时出错
  12. 没有导入纯Java驱动包

    3. .ArrayIndexOutOfBoundsException

    是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围
    

    4. ClassCastException - 类型强制转换异常

    什么场景会出现:

    在set集合中添加多种类型时会出现

    5.IllegalArgumentException- 传递非法参数异常

    什么场景会出现:

    方法传递的参数如果涉及到类型转换,如果转换的不是自己想要的格式会出现这种情况
    image.png

    6.IArithmeticException - 算术运算异常

    什么场景会出现:

    image.png

    7.IndexOutOfBoundsException - 下标越界异常

    什么场景会出现:

    一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误
    2、异常类Throwable - 图4

    8.INumberFormatException - 数字格式异常

    在页面向controller传参时用String接收的参数,但是数据库实体中jies接收该参数时是int类型
    


    三、throw和throws的区别

  13. throw:

  • 表示方法内抛出某种异常对象
  • 如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
  • 执行到 throw 语句则后面的语句块不再执行

image.png

  1. throws:
  • 方法的定义上使用 throws 表示这个方法可能抛出某种异常
  • 需要由方法的调用者进行异常处理

image.png

四、自定义异常

(1)继承 Exception 或 RuntimeException

/**IllegalAgeException:非法年龄异常,继承Exception类*/
class IllegalAgeException extends Exception {
    //默认构造器
    public IllegalAgeException() {
    }
    //带有详细信息的构造器,信息存储在message中
    public IllegalAgeException(String message) {
        super(message);
    }
}

(3)使用异常

class Person {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) throws IllegalAgeException {
        if (age < 0) {
            throw new IllegalAgeException("人的年龄不应该为负数");
        }
        this.age = age;
    }

    public String toString() {
        return "name is " + name + " and age is " + age;
    }
}

public class TestMyException {
    public static void main(String[] args) {
        Person p = new Person();
        try {
            p.setName("Lincoln");
            p.setAge(-1);
        } catch (IllegalAgeException e) {
            e.printStackTrace();
            System.exit(-1);
        }
        System.out.println(p);
    }
}

image.png