一.概念
- 异常:程序运行过程中出现的非正常情况
- 异常处理的必要性:任何程序在运行过程中都会出现大量的非正常情况,如果没有正确的处理异常情况,给用户带来损失,或者不必要的麻烦。
- 异常的处理:预先准备一段代码,在异常发生时,执行此代码。
二.异常的分类
-
Throwable:java中所有异常和错误的父类
-
位置:java.lang包
-
常用方法:
getMessage();返回详情信息 printStackTrace();打印堆栈信息
-
结构图
-
-
Error:错误
-
特点:仅仅依靠程序无法处理的问题,如硬件问题、jvm问题、逻辑问题
-
例子
java.lang.StackOverflowError;当应用程序递归太深而发生的堆栈溢出,抛出的错误
-
-
Exception:异常
- 特点:可以处理
- 分类:
-
非RuntimeException:非运行时异常
-
发生在程序编译时期的异常,必须处理掉;又称编译时异常,受查异常,已检查异常
-
Exception的子类中除了RuntimeException的所有子类,包括子类的子类
-
例子
java.lang.ClassNotFountException;类未找到异常
-
-
RuntimeException;运行时异常
-
编译时不报错,运行时报错,可以处理,也可以不处理;又称未未检查异常
-
Exception下Runtime及其子类
-
例子:
java.lang.NullPointerException:空指针异常 java.lang.ArrayIndexOutOfBoundsException:数组下标越界异常 java.lang.ClassCastException:类型转换异常 java.util.InputMismatchException:输入不匹配异常 java.lang.ArithmeticException:算数异常 ....
-
-
三.异常的产生
- 自动产生异常:当程序遇到可能出现错误的代码,会发生异常
- 手动产生异常:
-
位置:方法内部
-
语法
throw 异常对象;//手动抛出异常 //new xxxException();没有异常信息 //new xxxException(String s);s代表异常的详细信息
-
作用:相当于return,结束当前方法的执行
-
四.异常的传递
- 异常具有传递性:按照调用链的方向(main方法—>m1方法—>m2方法---->m3方法)反向传递(m3—>m2—>m1---->main),最终交给JVM处理,JVM默认打印堆栈信息
五.异常处理
- 消极处理
-
语法:声明异常
修饰符 返回值类型 方法名 (参数列表) throws 异常类型1,异常类型2.....{ //产生异常 }
-
作用:可以保证程序编译通过
-
效果:消极处理异常的方式是不负责任的处理方式,把异常交给调用者处理,并不能解决程序因为异常而终止的结果
-
- 积极处理:
-
语法:捕获异常
try{ //可能发生异常的代码 } catch(异常的类型 异常名){ //异常处理 }
-
注意
- catch可以有多个,产生的异常类型依次对比catch()中异常的类型,对比成功执行当前catch块
- catch捕获异常存在多态,子类异常写在上面,父类异常写在下面
- 可以获取任何没有发生的运行时异常,不可以试图捕获没有发生的编译时异常
-
finally
try{ //可能产生的异常 }catch{ //异常处理 }finally{ //无论异常是否发生都必须执行的代码 }
- 作用:关闭资源
- 注意:开发中通常不把return放在finally中
-
trycahch执行条线(结构)
try{}catch(){} try{}catch(){}catch(){}... try{}catch(){}...finally{} try{}finally{} try{try{}catch(){}...finally{}}catch(){} try{}catch(){try{}catch(){}...finally{}} try{}catch(){}...finally{try{}catch(){}...finally{}}
-
六.自定义异常
//自定义异常类型继承Exception及其子类---运行时异常RuntimrException及其子类
class 类名 extends 异常类{
//无参构造方法
public 类名 (){}
//有参构造方法---给异常详情信息赋值
public 类名(String message){
super(message);
}
}
七.方法覆盖
-
方法覆盖初级版
方法名相同,参数列表相同,返回值类型相同,访问修饰符相同或更宽
-
方法覆盖进阶版
方法名相同,参数列表相同,返回值类型相同,访问修饰符相同或更宽 子类不能抛出比父类更大的异常(与运行时异常无关)
-
方法覆盖终极版
方法名相同,参数列表相同,访问修饰符相同或更宽 子类不能抛出比父类更大的异常(与运行时异常无关) 子类的返回值可以是父类返回值的子类和本身
看完如果对你有帮助,感谢点赞支持!