Java-异常
异常是什么?
怎么处理异常?
异常
在程序执行的过程中,出现的非正常的情况,导致JVM非正常停止
异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象,java处理的方式是中断处理。
异常不是语法错误!!
异常体系:
异常的最顶层的父类java.lang.Throwable
子类:java.lang.Error
与java.lang.Exception
1 | graph LR |
处理
第一种:抛出,交给虚拟机处理
虚拟机的处理方式:中断处理,把异常打印在控制台上
1 | public static void main(String[] args) throws ParseException { |
第二种:try/catch
优点:程序抛出错误后,还可以继续运行。
Error的问题必须修改代码
异常产生的过程
第一步:
在遇到不正常的情况时,jvm会做两件事情
- 根据异常产生的原因创建一个异常对象,这个对象包含了一场产生的内容,原因,位置
- 在出现异常的方法中,没有异常的处理逻辑(没有
try/catch
),那么jvm就会把异常调出给方法的调用者,main方法来处理这个异常
第二步:
如果main无法处理这个异常,则会把异常抛出给main方法的调用者——jvm;
第三步:
JVM接受到这个异常,继续做两件事情
- 打印异常
- JVM中止当前的java程序——中断处理
异常的处理
五个关键字:
1 | try catch finally throw throws |
throw
可以抛出指定的异常throw new xxException("异常产生原因")
注意:
throw
关键字必须写在方法的内部throw
关键字后边new
的对象必须是Exception
或者是Exception
的子类对象throw
关键字抛出指定的异常对象,我们就必须处理这个异常对象throw
关键字后边创建的如果是RuntimeException
或者是RuntimeException
的子类对象,我们可以不处理,默认交给jvm处理(打印异常对象,中断程序)throw
关键字后边创建的如果是编译异常,我们必须处理这个异常,要么throws
要么try/catch
- 空指针异常
NullPointexception
是一个运行期异常,我们不必处理 ArrayIndexOutOfBoundsException
也是一个运行期异常
注意:
工作中我们要对传递过来的参数进行合法性校验,
如果参数不合适,那么我们就必须使用异常给定方式,告知方法的调用者,传递的参数有问题。
1 | private static void get(int[]arr,int index){ |
throws
异常处理的第一种方式:交给别人处理
作用:
当方法内部抛出异常对象的时候,我们就必须处理这个异常对象,
可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理——中断处理。
1 | //方法声明时使用 |
注意:
- 必须写在方法的声明处
- 声明的异常必须是
Exception
或者他的子类 - 方法内部如果抛出了多个异常对象,那么
throws
后边也必须声明多个异常 - 如果抛出的异常对象有子父类关系,则只声明父类异常即可
- 调用了一个声明抛出异常的方法,我们就必须的处理声明的异常,要么继续使用
throws
声明抛出,交给方法的调用者处理,最终交给JVM
,要么try/catch
自己处理异常 FileNotFoundException
是编译异常,抛出了编译异常就必须处理这个异常IOException
也是一个编译异常,必须处理- 中断交给异常处理之后不会再执行之后的代码
1 | public static void main(String[] args) throws IOException { |
try/catch
第二种处理方式:自己处理异常
1 | try{ |
注意:
- try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
- 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕之后,继续向下执行
- 如果try中没有产生异常,则catch中的代码不会执行,将继续执行之后的代码
- catch里面定义的异常变量,如果有子父类关系,那么子类的异常变量必须在上
1 | public static void main(String[] args) { |
finally
finally代码块:无论是否出现异常,都要执行
注意事项:
- 不能单独使用
- finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放
1
2
3
4
5
6
7try{
readFile("d:\\a.tx");
}catch(IOException e){
System.out.println("传递的文件的后缀不是txt");
}finally {
System.out.println("后续会继续执行");
}
Throwable
Throwable 类是 Java 语言中所有错误或异常的超类
包路径
1 | java.lang |
常用方法
1 | public String getMessage() |
示例代码:
1 | public static void main(String[] args) { |
自定义异常
Java自带的异常类不够我们使用,我们需要自定义一些异常类
1 | public class xxxException extends Exception|RuntimeException{ |
注意:
- 自定义异常类一般都是以
Exception
结尾,说明该类是一个异常类 - 自定义异常类,必须得继承
Exception
或者RuntimeException
Exception
:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了异常,就必须处理这个异常,要么throws
要么try/catch
RuntimeException
:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机
1 | public class RegisterException extends Exception{ |
所有的异常类都会有一个带异常信息的构造方法,
方法内部会调用父类带异常信息的构造方法,让父类来处理这个异常信息
父类错误,子类也会跟着报错,不论子类是否错误