Java中Exception机制
Java中最基本的一个概念就是异常「Exception」以及对异常的处理Try…Catch…,对异常的处理手段有两种
- Catch
- Throws
也就是说任何一个new出来的Exception对象,都应该在函数中被以上两个处理方式的至少一个进行处理
自定义的Exception
除去Java本身默认的一些Exception(例如NullPointException,IOException)之外,也可以通过继承来自定义一些Exception
public class CustomException extends Exception {
private String errorCode;
//无参构造函数
public CustomException() {
super();
this.errorCode = Constants.DATABASE_EXCEPTION_FLAG;
}
//构造函数
public CustomException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
//构造函数
public CustomException(String message) {
super(message);
this.errorCode = Constants.FAIL_FLAG;
}
}
函数抛出Exception
当函数中处理到某一步骤,产生了异常情况就可以向外抛出,然后调用该函数的地方需要对该异常进行处理,或继续抛出,再不断抛出的过程中,最终必须是Catch处理,不然程序就会崩溃(对应的WebApp就是显示错误页面)
void methodA() throws Exception {
....
throw new Exception();
return;
}
void methodB() throws Exception {
this.methodA();
.....
//这里的代码在A抛出异常后就不会执行
return;
}
void methodC() {
try {
this.methodB();
} catch (Exception e) {
e.printStackTrace();
}
.....
//这里的代码在catch住异常后可以继续执行
}
这种处理逻辑一般称之为向上抛出。
Catch异常的顺序
try…catch…中可以对不同异常进行不同的catch处理,但是catch「Exception类」必须放在最后,因为Exception类是所有其它异常的基类,可以指向任何一个异常,放在前面所有的异常都会被catch到
try {
this.methodB();
} catch (CustomException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
感觉有点像switch…case…里的default选项。
函数应该Throws什么
在刚刚到向上抛出异常的函数中,我们全部用的都是「Exception类」,如同catch异常顺序一样,Exception具有通用性,所以不管内部产生什么异常都可以被throws出来。
void methodA() throws Exception {
....
throw new CustomException();
return;
}
void methodB() throws CustomException {
....
throw new Exception();
return;
}
以上两种情况有什么区别呢
逻辑成立的区别
在MethodA中逻辑是城里的,会抛出一个Exception指针,指向一个CustomException对象。
在methodB中由于new的是Exception,但是抛出的是CustomException,而CustomException为子类,所以程序会报错,相当于Exception没有处理。
代码自动补全的区别
在intelliJ中,有try…catch…自动补全功能,在对methodA进行自动补全,catch里补全的是「Exception类」,而对methodB进行补全的时候,补全的是「CustomException类」。所以说自动补全只和throws后紧跟的类有关
Throws多个异常
除了通过Exception进行通用指针指向之外,还可以同时丢出多个异常,这样自动补全就会全部补全上
void methodA() throws Exception,CustomException {
....
throw new CustomException();
return;
}