【Java】异常(Exception)
1.1 异常的概念
异常是指程序运行过程中发生的错误,如用户输入错误、除数为零、数组下标错误等。
异常处理是指程序在出现问题时不被中断,依然可以正确的执行完。如果异常不被处理程序将非正常终止。
1.2 异常的分类
Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示。java.lang.Throwable 类是所有异常类的父类,他有两个直接子类:Error 类和 Exception 类。Error 类型的异常是程序无法处理的,表示运行程序中较严重的问题,代码编写者无需进行处理。Exception 是程序本身能过处理的异常,在 Java 程序设计时,需要关注 Exception 类。通常 Java 的异常可分为:RuntimeException 运行时异常和 CheckedException 已检查异常。
1.2.1 RuntimeException 运行时异常
派生于 RuntimeException 的异常包含以下几种情况:
-
ArithmeticException 算术运算异常
-
NullPointerException 空指针异常
-
ClassCastException 类型转换异常
-
ArrayIndexOutOfBoundsException 数组下标越界异常
-
NumberFormatException 数字格式异常
这些异常通常是由编译错误导致的,即设计或实现方式不当导致的问题。
1.3.2 CheckException 已检查异常
所有不是 RuntimeException 的异常统称为 CheckException。这类异常在编译时就必须做出处理,否则无法通过编译。处理方式有两种:使用 “try-catch-finally” 捕获异常、使用 "throws"声明异常。
2.1 异常的处理
2.1.1 捕获异常
捕获异常是通过 “try-catch-finally” 三个关键字来实现的。将可能产生异常的语句放入到 try{ } 语句中,然后在该语句块后跟一个或多个 catch 语句块,当 try{ } 语句中产生的异常与某个 catch 语句处理的异常类型相匹配,则执行该 catch 块。finally 语句块用于为异常处理提供一个统一的出口,无论 try{ } 语句块中是否产生异常,finally 语句块中的所有语句都会被执行(catch 语句块可以有多个;finally 语句块最多只能有一个,根据需要可有可无)。
try-catch-finally 组合语句的语法如下:
try {
//一条或多条可能抛出异常的语句
}catch (ExceptionType1 e) {
//当 ExceptionType1 类型的异常抛出后将要执行的代码
}catch (ExceptionType2 e) {
//当 ExceptionType2 类型的异常抛出后将要执行的代码
}
......
[finally {
// 无论是否发生异常,都要被执行的语句块
}]
■ try:
在执行过程中,当任意一条语句产生异常时,就会跳过 try{ } 语句块中后面的代码,且当异常处理结束后,也不会回到 try{ } 语句块中执行尚未执行的代码。
■ catch:
常用方法(这些方法均继承 Throwable 类):
● toString() 方法,显示异常的类名和产生异常的原因。
● getMessage() 方法,只显示产生异常的原因,不显示异常的类名。
● printStackTrace() 方法,用来跟踪异常事件发生时堆栈的内容。
catch 捕获异常时的捕获顺序:
如果异常类之间有继承关系,在顺序安排时将子类放在前面。
2.2.1 声明异常(throws)
throws 关键字是在方法声明中用来指明该方法可能抛出的所有异常,方法不处理这些异常,而是调用层次向上传递,谁调用这个方法,这个异常就由谁来处理。调用可能会抛出异常的方法,必须添加 try-catch-finally 代码块尝试去捕获异常或者添加 throws 声明来将异常抛出给更上一层的调用者进行处理。
如果一个方法抛出多个已检查的异常,就必须在方法的首部列出所有的异常,之间用逗号隔开。如下面这个例子所示:
class Test