Java的异常处理机制
1、 java异常处理机制
java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。
2、 异常发生原因
异常发生原因有很多,通常包含以下几大类:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其他一些事因为物理错误引起的。
要理解java异常处理是如何工作的,你需要掌握以下三种类型的异常: - 检查性异常:最具代表的检查性异常是用户错误或问题引发的异常,这种程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单忽略。
- 运行时异常:运行时异常是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
3、捕获异常
Java异常处理机制为:抛出异常,捕抓异常,处理异常。
通过使用try…catch来捕获异常,try…catch语法结构
:try {
//业务功能代码
} catch(异常类1 e1) {
//异常处理代码1
} catch(异常类2 e2) {
//异常处理代码2
}…catch(异常处理n en) {
//异常处理代码n
}
在使用try…catch捕获处理异常时需要注意: - 不要过度使用异常,不能使用异常处理机制来代替正常的流程控制语句。
- 异常捕获时,一定要先捕获小异常,在捕获大异常。否则小异常将无法被捕获
- 避免出现庞大的try块
- 避免使用catch(Exception e){}
- 不要忽略异常
4、 Exception类的层次
所有的异常类是从java.lang.Exception类继承的子类
Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error。Java程序通常不捕获错误。错误一般发生在严重故障时,它们在java程序处理的范围之外。Error用来指示运行时环境发生的错误,例如,JVN溢出。一般的程序不会从错误中恢复。
异常类有两个主要的子类:IOException类和RuntimeException类。
5、 finally块
finally块一般用来关闭物理资源(数据库连接、网络连接、磁盘文件等),这些物理资源必须显式关闭。除非在try块、catch块中调用了退出虚拟机的方法(System.exit(0);),否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块一定会被执行。
6、 使用throws和throw抛出异常 - throw
java也允许程序自行抛出异常,自行抛出异常使用throw语句来完成(注意此处的throw没有后面的s)如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例 - throws
使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,给异常应该由上级调用者处理;如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方式是,打印异常的跟踪栈信息,并中止程序运行。