Java学习——异常处理

Java提供了一套完善的异常处理机制

什么是异常:Java的异常是一个对象,这个对象描述了代码中出现的异常情况。在代码运行异常时,在有异常的方法中创建并抛出一个表示异常的对象,然后在相应的异常处理模块中进行处理。

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语句后,中间不能有其他任何代码。

Java学习——异常处理

Java学习——异常处理

多个catch语句,捕获父类异常的catch语句必须放在后面,否则它会捕获它的所有子类异常,而使得子类异常catch语句永远不会执行:

Java学习——异常处理

Java学习——异常处理

printStackTrace()方法:获取异常的堆栈信息

异常类中非常重要的方法:prinStackTrace(),该方法将在Throwable类中定义,它的作用是把Throwable对象的堆栈信息输出至输出流:

Java学习——异常处理

Java学习——异常处理

NullPointerException为未检查异常,并不是一定需要捕获的,Java会处理它。

程序编译时发生错误:

Java学习——异常处理

程序编译通过:

Java学习——异常处理

catch捕获了异常,并把异常信息打印了出来 。

finally语句块:

在出现异常的时候,异常处理之前的代码不会被调用。

Java学习——异常处理

有的时候有些语句块是必须执行的,finally语句块是异常捕获里的重要语句,它规定的语句块无论如何都要执行。在一个try-catch中只能有一个finally语句块,一般情况 下finally语句块一般放在最后一个catch语句块后,不管程序是否抛出异常,它都会执行。

Java学习——异常处理

Java学习——异常处理

Java学习——异常处理

定义抛出异常的格式:

修饰符 返回值类型 方法名()throws 异常类型1,异常类型2...{

//方法体

这种抛出异常的方式为隐式抛出异常,还有一种称为显式抛出异常:通过throw关键字来实现

Java学习——异常处理

异常分为检查异常和非检查异常,定义在方法中的异常,在主方法中调用的时候非检查异常可以不放在try-catch语句块中,但是检查异常必须放在try-catch语句块中。

非检查异常和检查异常使用throws、throw的区别:

对于非检查异常,在方法抛出时可以不用throws来声明,而检查异常则必须在throws中声明或者捕获后才能进行throw抛出异常。

Java学习——异常处理

修改后的程序 :

Java学习——异常处理

Java学习——异常处理

非检查异常:ArithmeticException\NullPointerException\IndexOutOfBoundsException

检查异常:ClassNotFoundException\IllegalAccessException

创建自己的异常类:

创建自己的异常类:只需要继承Exception类并实现一些方法即可。它的一般形式:

class 类名 extends Exception{

//类体

}