在平常写代码过程中,不可避免地会出现一些错误,有的是程序员自己造成的,有的也可能是用户在使用过程中没有按照规范而引起程序无法正常执行等,上述情况统称为异常。一旦产生异常,若程序员不加处理,程序就会终止运行。
在Java中,java.lang.Throwable是异常体系的根父类,即所有的亦称类均继承与这个类。在这之下,分为java.lang.Error与java.lang.Exception两个类。java.lang.Error通常代表程序的错误,这些错误通常指程序的编写异常,如一行程序的末尾没有加上分号,在运行时就会报Error错误。java.lang.Exception通常指程序在运行时产生的异常,包括数组下标越界、除数为0等异常,对于Exception的异常,一定要编写针对性的代码区处理异常。java.lang.Exception又分为Exception(编译时异常)与RunTimeException(运行时异常)两个异常。
常见的异常:
ArithmeticException :除数为0;
ArrayIndexOutOfBoundsException :数组下标不合法,即下标为负或下标越界;
NullPointerException :空指针异常,包括使用的对象未实例化就调用其方法等;
ArrayStoreException:读取数组中错误的数据类型;
IOException:通常的I\O错误;
FileNotFoundException:是IOException的子类,访问不存在文件异常;
......
处理异常的两种方式
1.try - catch - finally模型
代码如下
try {
//可能会出现异常的代码
} catch (异常类1 e) {
} cath (异常类2 e) {
} ...finally {
}
在try后的代码块中,存放有可能会出现异常的代码,catch后的( )中的异常类名可以是上述的常见异常类,也可以是自定义异常类," 异常类名 e " 代表创建了这个该异常类的一个对象,对象名为e,在catch后的代码块中,可以使用 e.printStackTrace() 来输出异常信息,也可以自己编写输出语句来显示该异常,若try中捕获了异常且catch后创建了该异常的对象,那么就会进入catch中处理异常。
一个try后可以后多个catch,因为try中可能不止一种类型的异常,因此用多个catch来抛出多个异常对象,使代码更严谨。若这些异常之间存在子父类关系,一点要将子类异常声明在父类异常之上,否则报错。
try中声明的变量,出了try结构后就不能再使用。
try - catch - finally 支持嵌套操作,即try中可以继续使用try - catch - finally。
若try中会产生异常的代码后还有代码,该异常一经抛出,其后的代码(try中的)就不会执行。
对于finally中的代码无论try中是否产生了异常,均会执行,故在finally中,通常用来声明关闭操作,例如输入输出流关闭、断开数据库连接等,若不执行上述的关闭操作,垃圾回收器就不会回收这些资源,进而导致内存泄漏。
无论try中是否有return语句,finally中的语句都会被执行。
2.throws模型
代码如下
public void func(...) throws 异常类型1, 异常类型2,... {
}
该代码针对与func中可能出现的异常进行了向上抛出,即抛给调用他的类,调用者有两种处理情况,使用 try - catch - finally 处理异常或继续向上抛出,直到抛给main,在main中就要使用 try - catch - finally 处理异常。
子类重写父类的方法抛出的异常可以是父类中被重写方法的异常或是该异常的子类。
3.手动抛出异常
throw new 异常名(...);
括号中可传入具体的异常信息,throw会将该异常抛给调用它的类,调用者需对该异常进行处理。
try - catch - finally 与 throws 的使用场景
若涉及到资源调用,则需要使用 try - catch - finally 处理异常,防止内存泄漏;
若父类被重写的方法没有使用throws抛出异常,若子类重写的方法中出现异常,就要使用 try - catch - finally 处理异常,不能抛出异常;
若方法A依次调用方法B、C、D时且B、C、D是递进关系,若B、C、D中出现异常,选择用throws抛出异常,而A使用 try - catch - finally 处理异常;
......
自定义异常类
对于现有的异常类,可能有时候并不能准确表达出我们想要的异常,这是我们就可以自定义异常类供我们使用。
定义方式:
该异常类继承于现有的异常体系,通常继承于RunTimeException 或 Exception;
提供几个重载的构造器;
具体代码
public class MyException extends RunTimeException/Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
//...
}
message即为想要具体显示待异常信息,可在手动抛出异常时加入。该自定义异常类的使用方法与java自带的异常类使用方法相同。