异常

定义

程序运行过程中,出现了不正常的情况。最终导致JVM的非正常停止JAVA把这些问题描述成了异常类。出现了不正常就需要把问题报出来。

异常体系

java.lang.Throwable

运行时异常(不可检测异常)

就是运行时由于代码逻辑或者jvm内部内存不足而导致程序崩坏。

  • Error 错误,虚拟机异常,系统级别的。
  • Stack Over Flow Error:栈溢出误差
  • Out of Memory Error:内存不足错误。
  • RuntimeException以及其子类,运行期异常,本异常是程序员的代码逻辑错误导致的,编译器不会提示,采用默认处理规则。
  • java.lang.NullPointerException:空指针异常,出现原因:调用了未经初始化的对象或者是不存在的对象。
  • java.lang.ClassNotFoundException指定的类找不到;原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。
  • java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
  • java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。
  • java.lang.IllegalArgumentException 方法传递参数错误。
  • java.lang.ClassCastException 数据类型转换异常。
  • java.lang.NoClassDefFoundException 未找到类定义错误。
  • SQLException SQL 异常,常见于操作数据库时的 SQL 语句错误
  • java.lang.InstantiationException 实例化异常。
  • java.lang.NoSuchMethodException 方法不存在异常。

非运行时异常

可检测异常,编译时异常,非RuntimeException,编译期异常,在写代码的时候编译器如果不给处理方式,就编译不通。需要我们手动try或者抛出的异常。

异常对象的常用方法

  • public void printStackTrace();打印异常信息,包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
  • public String getMessage();获取发生异常的原因,提示给用户的时候就提示错误原因。
  • public String toString();获取异常的类型和异常描述信息(不用)。

异常处理

  • throw 用在方法内部,用来抛出异常对象。
  • try-catch-finally
  • try:用来检测异常。
  • catch:捕获异常。
  • finally:关闭资源,一定会执行,除了遇到System.exit();

注意:
1. 可以有多个catch,去捕捉
2. 在try后,出现了一个异常,后面的代码将不会继续执行。

throw和throws区分

throw

作用:创建异常对象,当程序运行到此处时就会发生我们创建的异常,如果没有处理try/catch,是直接跑给虚拟机的那么程序就会停止运行。

用法:在方法内使用。

格式:

throw new 异常类名()

throws

作用:当我们编写代码时发生变异时异常,我们不想try/catch处理掉,那我们就可以使用throws把异常抛出去,交给人处理,这里谁使用本方法谁就去处理,如果是在主函数main方法中就把异常给抛出去,那么就是Jvm虚拟机处理,他们的处理方式就是一旦发生异常就会让程序停止运行。

格式:

public static void main(String[] args) throws InterruptedException{}

自定义异常类

格式:
1. 创建一个类,继承Exception。
2. 根据父类的构造,生成一个可以添加异常信息的构造方法。
3. 通过throw抛出一个异常对象。

注意:

  • 自定义运行时异常,继承RunTimeException。
  • 自定义编译时异常,继承Exception。

++问题:自定义异常实现用户注册用户名重复的异常提醒。++

测试类Demo01.java

public class Demo01 {

    //创建一个数组,模拟数据库

    static String[] arr = {"Tracy", "James", "Jon"};

    public static void main(String[] args) throws LoginExcption {
        //键盘录入,模拟注册时,输入用户名
        Scanner sc = new Scanner(System.in);
        String username = sc.nextLine();

        //校验用户名是否存在
        checkName(username);//如果出现异常后面的代码将不会继续执行。
        System.out.println("注册成功");
    }

    //此方法用于校验用户名是否存在
    public static void checkName(String username) throws LoginExcption {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].equals(username)) {
                throw new LoginExcption("用户名已存在");

            }
        }
    }
}

自定义异常类LoginExcption.java

public class LoginExcption extends Exception {

    public LoginExcption() {
    }

    public LoginExcption(String message) {
        super(message);
    }
}