一、异常的理解
1. 异常:程序运行过程中出现的非正常的情况。
2. 异常的分类:
(1) 父类型:Throwable,位于 java.lang包中,Throwable 类是 Java 语言中所有错误或异常的超类(父类)
(2) 子类:Error,代表错误
(3) 子类:Exception,代表异常
二、异常的分类:【企业面试重点 + 考试重点】
1. Throwable:Throwable 类是 Java 语言中所有错误或异常的超类(父类)
(1) 提供的构造方法: Throwable():无参数的构造方法 Throwable(String message):有参数的构造方法,参数代表异常信息
(2) 提供功能方法: public void printStackTrace():打印输出异常的详细信息,用于开发人员调整程序应用 public String getMessage():获取字符串类型的异常信息,用于给用户展示提示信息
2. 子类:Error,代表错误
(1) Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题
(2) 案例:内存空间不足,或是Java虚拟机方法调用时栈溢出java.lang.StackOverflowError(栈溢出)。
(3) 特点:遇到这样的错误,程序中无法处理。
3. 子类: Exception ,代表异常
(1) 运行时异常:RuntimeException及其子类异常都为运行时异常 a. 特点:编译过程编译器不检测,运行过程中报错 b. 处理:这种异常可以避免,可以处理也可以不处理。 c. 常见的运行时异常: java.lang.ArrayIndexOutOfBoundsException(数组下标越界) java.lang.IndexOutOfBoundsException(下标越界-List集合) java.lang.StringIndexOutOfBoundsException(字符串下标越界) java.lang.ClassCastException(类型转换异常) java.lang.NullPointerException(空指针异常) java.lang.NumberFormatException(数字格式转换异常)
(2) 非运行时异常:和RuntimeException没有任何继承关系的异常类,称为非运行时异常(已检查异常) a. 特点:编译过程编译器检测,编译过程中报错 b. 处理:必须处理,否则无法运行 c. 案例:Class.forName("hello"); d. 注意:编译报错可能出现的原因: i. 语法错误 -> 修正 语法代码 ii. 出现非运行时异常-》需要异常处理才能解决
三、异常产生的原因
1. 自动产生异常:
(1) 运行程序时,遇到错误的代码,自动产生异常,程序自动终止
(2) 结果:程序因为异常而被终止
2. 手动产生异常:
(1) 关键字:throw
(2) 位置:必须应用方法内部
(3) 语法:throw new 异常类名();
(4) 结果:程序会被终止调用
四、异常的传递
异常传递: 按着方法的调用链方向反方向传递,直至JVM,最终导致程序终止。
五、异常的处理【企业开发的重点】
1. 消极处理异常:声明异常
(1) 关键字:throws
(2) 位置:定义在方法的声明
(3) 语法: 修饰符 返回值类型 方法名(形参)throws 异常类名1,异常类名2{}
(4) 作用:消极处理异常可以让非运行时异常编译通过,但是没有从根本上解决问题,只是推卸责任,最终程序还是 因为异常而被终止
(5) 注意:可以利用父类型处理子类型的异常
2. 积极处理异常:捕获异常
(1) 位置:定义在方法的内部
(2) 语法: try{ // 可能出现异常的语句 }catch(){ // 当异常出现时,执行的语句 }
(3) try后面可以跟多个 catch结构,从上往下依次匹配;借助多态的语法,利用父类型处理子类型的异常,但是子 类在前,父类在后
(4) finally:应用在积极处理异常语法中 i. finally中定义的语句:不管有没有都会执行
ii. try..catch...finally try{ //可能出现的异常语句 }catch(异常类名 e){ //异常处理语句 }finally{ //在任何情况下都必须执行的代码 }
六、自定义异常类
1. 定义一个类继承 异常类
(1) 定义异常类如果为运行时异常,则需要继承 RuntimeException class CheckedPasswordException extends RuntimeException{}
(2) 定义异常类如果为非运行时异常,则需要继承 Exception class CheckedPasswordException extends Exception{}
2. 提供 两个构造方法
(1) 一个无参数的构造方法
(2) 有参数的构造方法:带有字符串类型参数的构造方法 public CheckedPasswordException(String message){ super(message); }
// 自定义异常类 class CheckedPasswordException extends Exception{ public CheckedPasswordException(){} public CheckedPasswordException(String message){ super(message); } }
七、方法的覆盖【终极版 -- 企业面试重点+企业级开发重点-细节处理+考试重点】
1. 子类的方法名、形参列表、返回值类型 和 父类相同
2. 子类的访问修饰符和父类相同或是比父类更宽
3. 子类不能抛出比父类更多、更宽的异常