Java提供了一套完善的异常处理机制
什么是异常:Java的异常是一个对象,这个对象描述了代码中出现的异常情况。在代码运行异常时,在有异常的方法中创建并抛出一个表示异常的对象,然后在相应的异常处理模块中进行处理。
异常的分类:
1、所有异常都是内置类Throwable的子类。Throwable有两个子类,一个是Exception,一个是Error;
2、Error这个分支定义了Java运行时的内部错误。它通常指明与运行环境相差的错误,应用程序不应该抛出这类异常,发生这类异常时通常是无法处理的;
3、另一个分支 是Exception,用于程序中应该捕获的异常。Exception也有两个分支,一个是RuntimeException,另一个分支是IOException
4、RuntimeException主要用来描述由于编程产生的错误,如上面的NullPointerException,它是RuntimeException的一个子类;RuntimeException还包含其它子类,如:IndexOutOfBoundsException(数组下标越界)、ArithmeticException(出现异常的运行条件,如“除以零”)
5、对于 Exception类,除RuntimeException以外其他的类在程序中出现是必须被处理的,而不像RuntimeException中的异常会由系统自己处理。
异常的使用:
异常捕获:java中使用try-catch语句块来进行异常捕获
try{//可能出现异常代码
}catch(异常类型1 异常对象){//对异常1的处理
}catch(异常类型2 异常对象){//对异常2的处理
}
.
.
.
.
.
catch(异常类型n 异常对象){//对异常n的处理
}
try语句块只能有一个,而catch则可以有多个,catch必须紧跟try语句后,中间不能有其他任何代码。
多个catch语句,捕获父类异常的catch语句必须放在后面,否则它会捕获它的所有子类异常,而使得子类异常catch语句永远不会执行:
printStackTrace()方法:获取异常的堆栈信息
异常类中非常重要的方法:prinStackTrace(),该方法将在Throwable类中定义,它的作用是把Throwable对象的堆栈信息输出至输出流:
NullPointerException为未检查异常,并不是一定需要捕获的,Java会处理它。
程序编译时发生错误:
程序编译通过:
catch捕获了异常,并把异常信息打印了出来 。
finally语句块:
在出现异常的时候,异常处理之前的代码不会被调用。
有的时候有些语句块是必须执行的,finally语句块是异常捕获里的重要语句,它规定的语句块无论如何都要执行。在一个try-catch中只能有一个finally语句块,一般情况 下finally语句块一般放在最后一个catch语句块后,不管程序是否抛出异常,它都会执行。
定义抛出异常的格式:
修饰符 返回值类型 方法名()throws 异常类型1,异常类型2...{
//方法体
}
这种抛出异常的方式为隐式抛出异常,还有一种称为显式抛出异常:通过throw关键字来实现
异常分为检查异常和非检查异常,定义在方法中的异常,在主方法中调用的时候非检查异常可以不放在try-catch语句块中,但是检查异常必须放在try-catch语句块中。
非检查异常和检查异常使用throws、throw的区别:
对于非检查异常,在方法抛出时可以不用throws来声明,而检查异常则必须在throws中声明或者捕获后才能进行throw抛出异常。
修改后的程序 :
非检查异常:ArithmeticException\NullPointerException\IndexOutOfBoundsException
检查异常:ClassNotFoundException\IllegalAccessException
创建自己的异常类:
创建自己的异常类:只需要继承Exception类并实现一些方法即可。它的一般形式:
class 类名 extends Exception{
//类体
}