异常的顶级父类:Java.lang.Thro 从顶级父类中又分为两类一种是 Error:是指Java虚拟机无法解决的严重问题,比如jvm系统内部错误、资源耗尽等情况。无法通过针对性的代码来进行处理。另一种就是Exception:是因编程错误或者是偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。而Exception又分为编译时异常和运行时异常。编译时异常:一般是系统为了预防一些可能发生的错误( 比如在IO中读取的文件不存在等)。运行时异常:是系统不可以预测的异常,也就是程序存在的bug。
运行时异常比较常见一般我们不需要进行try-cath 或者是throw来进行处理。
编译时异常的处理方式:
第一种方式: Try -catch-finally : 出现异常,在自己的代码中进行处理
try{
可能出现的代码
}cath(异常类型1 变量名){
异常处理的方式
}cath(异常类型2 变量名){
异常处理的方式
}
。。。。。。。
finally{((可选择
)
//一定会执行的代码
}
在try -catch-finally结构中,cath中的异常类型需要保持异常类型1的范围要比异常类型2的范围小,不然会报错 。try -catch-finally结构中的finally中的内容是一定被执行的,通常在里面进行关闭线程以及IO流。
异常 处理的第二种方式:
通过Throws来进行抛出可能存在的异常。抛出异常是指程序在执行过程中,一但出现异常,就会生成一个异常类的对象并将这个对象进行抛出,一旦抛出对象后后面的对象就不会在执行了。
Throws +异常类型 方法一旦出现了错误,就会向方法的调用者抛出异常,如果方法的调用者还是选择抛出异常的话,那么这个异常对象还会向上一级进行抛出,知道抛出到main,如果此时还不进行处理的话就会把异常抛给虚拟机,一旦虚拟机无法处理,虚拟机就会瘫痪。
使用异常需要注意的点:
- 如果父类中被重写的方法没有使用throws来抛异常,那么子类的重写的方法也不能进行throws异常,如果子类重写的方法必须要进行异常处理的话必须使用try -catch结构进行处理。
- 子类重写父类的方法中throws的异常类型范围必须小于等于父类throws的异常类型范围。
用户自定义异常类:
第一步:继承与现有的异常结构。需要什么异常就继承什么异常结构
第二步:提供一个全局常量:serialVersionUID ,可以看成自定义异常类的唯一标识。
第三步: 提供重载的构造器,也是需要 那个构造器就使用那个构造器
public class MyException extends RuntimeException {
static final long serialVersionUID = -7034845766939L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
class shiyan{
private int id;
public void regis(int id){
if(id>0){
this.id=id;
}
else{
throw new MyException("输入了复数");
}
}
}
class mainTest{
public static void main(String[] args) {
shiyan shiyan = new shiyan();
shiyan.regis(-1);
}
}