异常
定义
程序运行过程中,出现了不正常的情况。最终导致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);
}
}
















