一、Java的异常
指的是程序运行过程中,因为用户的误操作、代码的BUG、 等等一系列原因,引起的程序奔溃的现象,被称为异常。在计算机程序运行的过程中,总是会出现各种各样的错误。有一些错误是用户造成的,比如,希望用户输入一个int
类型的年龄,但是用户的输入是abc
:
// 假设用户输入了abc:
String s = "abc";
int n = Integer.parseInt(s); // NumberFormatException!
还有一些错误是随机出现,并且永远不可能避免的。比如:
- 网络突然断了,连接不到远程服务器;
- 内存耗尽,程序崩溃了;
- 用户点“打印”,但根本没有打印机;
- ……
所以,一个健壮的程序必须处理各种各样的错误。
所谓错误,就是程序调用某个函数的时候,如果失败了,就表示出错。
因为Java的异常是class
,它的继承关系如下:
Throwable 异常的顶级类
|-- Error 致命性的错误
|-- Exception 常见的异常的父类
|-- RuntimeException 运行时异常,只有运行时,才有可能出现异常
其他的Exception的子类都是编译型异常,必须处理
二、 异常处理:
解决掉异常的现象,让程序继续运行(不要奔溃退出)下去。
程序容错能力提升!!!!程序就会越稳定!!!
java进行异常处理,有两种解决方案:
|-- 捕获异常
|-- 抛出异常
三、捕获异常
针对于可能出现异常的代码,进行抓捕
try {
// 可能发生异常的代码
} catch (Exception e) {
// 如果出现了一次,代码会立刻进入catch中
// 在这儿解决抓捕到的异常
} finally {
// 必须要执行的代码
}
如果使用抓捕异常,通过这种处理,程序即便是遇到了,也不奔溃!!!
四、try cath运行流程
1、出现异常的流程
2、不出现异常的流程
在Java中,凡是可能抛出异常的语句,都可以用try ... catch
捕获。把可能发生异常的语句放在try { ... }
中,然后使用catch
捕获对应的Exception
及其子类。
多catch语句
可以使用多个catch
语句,每个catch
分别捕获对应的Exception
及其子类。JVM在捕获到异常后,会从上到下匹配catch
语句,匹配到某个catch
后,执行catch
代码块,然后不再继续匹配。
五、多个异常的处理方案
如果某些异常的处理逻辑相同,但是异常本身不存在继承关系,那么就得编写多条catch
子句:
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException e) {
System.out.println("Bad input");
} catch (NumberFormatException e) {
System.out.println("Bad input");
} catch (Exception e) {
System.out.println("Unknown error");
}
}
因为处理IOException
和NumberFormatException
的代码是相同的,所以我们可以把它两用|
合并到一起:
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException | NumberFormatException e) { // IOException或NumberFormatException
System.out.println("Bad input");
} catch (Exception e) {
System.out.println("Unknown error");
}
}
六、finally关键字
无论是否有异常发生,如果我们都希望执行一些语句,例如清理工作,怎么写?
可以把执行语句写若干遍:正常执行的放到try
中,每个catch
再写一遍。例如:
try {
// 可能存在异常的代码
} catch(XxxException e) {
// 异常处理代码
} [finally {
}]
回收垃圾
关闭IO流
关闭数据库连接
……
核心必须要执行代码
try {
} finally {
// 将必须要执行的代码写在finally中!!!
}
注意:在开发过程中请注意,return关键字和finally关键字同时出现的情况,认真分析仔细考虑。
七、抛出异常
可以通过创建异常(系统或者自定义),来给调用者一个确切的错误信息调用者就可以通过抛出的信息做成对应的判断。
当发生错误时,例如,用户输入了非法的字符,我们就可以抛出异常。
如何抛出异常?参考Integer.parseInt()
方法,抛出异常分两步:
- 创建某个
Exception
的实例; - 用
throw
语句抛出。
八、自定义异常
接触到的都是属于java官方提供的异常类,
自己设计异常类
定义一个普通的类,让该类成为Exception类或者它的子类的子类
Java标准库定义的常用异常包括:
当我们在代码中需要抛出异常时,尽量使用JDK已定义的异常类型。例如,参数检查不合法,应该抛出IllegalArgumentException
:
static void process1(int age) {
if (age <= 0) {
throw new IllegalArgumentException();
}
}