Java异常问题小结

来源:互联网 发布:华硕路由器 知乎 编辑:程序博客网 时间:2024/06/06 09:01

一、异常的分类

这里写图片描述

在Java中,所有的异常都继承自Throwable,Throwable派生出来的子类有两种:Exception和Error。

Error(错误):程序无法处理的错误。大部分是编写的Java代码无关,是Java虚拟机层面出现的问题,比如运行时Java虚拟机内存不足。出现Error时,Java虚拟机只能尽可能友好的终止当前进程。

Exception(异常):程序可以处理的异常。Exception分为RuntimeException类及其子类以及非RuntimeException类及其子类。

在对异常进行分类时,有几个概念很容易混淆,需要特别注意。

1、受检查异常(checked exception)非受检异常(unchecked exception)

受检查异常:编译器要求必须处理的异常,在编译过程中就可以发现,如果不进行异常处理的话无法通过编译。除RuntimeException及其子类之外的所有Exception类及其子类都属于受检查异常。
非受检异常:编译器不强制要求处理,在运行过程中可能会出现。包括RuntimeException及其子类和Error类。

2、运行时异常非运行时异常

运行时异常:RuntimeException类及其子类,程序中可以选择捕获处理,也可以不处理,一般由程序逻辑错误导致,应该在编写代码时就尽量避免发生。比如数组越界异常(IndexOutOfBoundsException)、空指针异常(NullPointerException)。使用throws抛出异常时,调用者可以不进行异常处理。
非运行时异常(编译异常):除RuntimeException及其子类之外的所有Exception类及其子类,语法规定必须处理的异常,如果不处理不能通过编译。如在代码中进行IO操作或者数据库操作时,编译器都会提示要进行异常处理。使用throws抛出异常时,调用者必须处理该异常。

二、throws和throw的区别 throws和try/catch的区别

1、throws和throw的区别
这里写图片描述
例如:

//通过throw抛出异常public static void method() {    int a = 10;    int b = 0;    if (b == 0) {        throw new ArithmeticException();    } else {        System.out.println(a / b);    }}//通过throws抛出异常,调用method2的地方一定要进行异常捕获或者接着抛出异常public static void method2() throws Exception{    int a = 10;    int b = 0;    if (b == 0) {        throw new Exception();    } else {        System.out.println(a / b);    }}

2、throws和try/catch的区别

try/catch是自己捕捉异常,自己处理异常。
throws是捕捉到异常,抛出,自己不进行处理。

三、异常注意事项

1、子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类;
2、如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常;
3、如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws;
4、尽量使用try/catch捕获处理异常。

0 0
原创粉丝点击