文章目录
1. 异常
- 作用:使得程序更加健壮。比如当程序遇到很小错误时,不至于让整个程序停止。
- 分类:
Error
:指程序遇到严重错误,程序无法继续运行下去。比如:StackOverFlowError
栈溢出、Out of memory Error
内存不足等。Exception
:指程序遇到一般性错误,可以通过异常机制解决该错误,使得程序能够继续进行下去。比如:读取不存在的文件等
- 编译时异常:必须处理
- 运行时异常:可以不处理
NullPointerException
:空指针异常。指某引用类型变量未赋值(默认指向null)就使用。ArithmeticException
:算术异常。如:除以0ArrayIndexOutOfBoundsException
:数组下标越界异常。ClassCastException
:类的转型异常。NumberFormatException
:字符串转为基本数据类型异常。- 异常体系图(重要!!!)
- 练习:
2. 异常处理(2种处理方式)
对一定出现 或 可能出现异常的地方进行处理。有两种方式:
- try-catch-finally:直接处理异常
- throws抛出异常:不管,抛出去,间接处理异常,实际的异常交给调用者处理。最终,要么被try-catch-finally处理,要么被jvm处理。
2.1 try-catch-finally
- try-catch-finally:程序员在代码中捕获异常,并直接处理异常。
- 细节:
- try中某行发生异常,则try中后续的语句不会再执行。
- 可以没有
catch
:那么相当于没有捕获异常,那么程序出现异常后,在执行finally后就退出程序。
- 可以没有
finally
。- try中有多个异常,则可以使用多个
catch
捕获多个异常。但是:捕获子类异常写在前,捕获父类异常在后。且前面捕获了异常,则后面不会再进行捕获。
当然也可以只使用最高父类Exception直接捕获所有异常。
- 关于
try-catch-finally
中的return
:首先执行完try-catch-finally逻辑,途中遇到return只是执行,并将待返回的结果用temp变量保存起来,而不返回;最后再判断返回哪个return对应的temp值。判断条件如下:
- finally中有return,则必返回finally中return对应的temp
- finally中没有return,且无异常发生,则返回try中return对应的temp
- finally中没有return,且发生异常,则返回对应catch中return对应的temp值
- 练习:
2.2 throws抛出异常
2.2.1 throws
throws抛出异常:不管,抛出去,间接处理异常,实际的异常交给调用者处理。最终,要么被try-catch-finally处理,要么被jvm处理。
2.2.2 throw
- throw是程序员主动制造一个异常。异常的处理如下:
① 如果用throw
主动抛出一个异常,则所在方法采用throws
抛异常,
② 然后由方法的调用者使用try-catch-finally捕获异常。
或者方法的调用者所在方法再使用throws抛异常,一直下去,直到某一个方法的调用者使用try-catch-finally捕获异常。
- throw在方法中使用,语法:
throw new 异常类名("异常信息")
- 在
try-catch-finally
中处理throw
的顺序和处理return
的顺序一样。
2.2.3 throws vs throw
2.3 细节
细节:
- 每一可能异常处:要么使用
try-catch-finally
处理异常,要么向上throws
异常。- 对于编译异常必须处理。【哪些属于编译异常,可以看上面的异常体系图】
- 对于运行时异常的方法,如果既不使用
try-catch-finally
,也不使用throws
。则默认使用throws
,所以什么也不做,最终是使用throws机制到最顶级的jvm退出的程序。- 子类重写父类抛异常的方法时,所抛的异常与其相同或者为其子类型异常。
2.4 练习
3. 自定义异常
- 自定义类继承
Exception
类属于编译异常,继承RuntimeException
属于运行时异常。【我们自定义异常类一般继承RuntimeException
,因为运行时异常具有默认的throws机制,不用自己写】- 例子: