整理java异常机制
java中的所有异常都是ThrowAble的子类。ThrowAble又分为:
- error
- Exception
error这里暂时先不做研究,Exception又分为:
- 运行时异常(Runtime)
- 编译时异常
用代码来体现下两种异常的区别
下面为代码抛出运行时异常,方法在编译时没有任何问题
public void testRuntimeException(){
throw new RuntimeException();
}
如果在代码中主动抛出其他类型异常(不是RuntimeException及其子类),在编译时就会报错 必须使用try catch 或者在方法上抛出异常。
//编译报错
public void testOtherException(){
//激活接口所使用的一般异常,(这里随便在api里面找的)
throw new ActivationException();
}
//方法上显示抛出,让调用此方法者处理此异常
public void testOtherException2() throws ActivationException{
//激活接口所使用的一般异常,(这里随便在api里面找的)
throw new ActivationException();
}
//本层处理掉此异常,不向上层抛出
public void testOtherException3(){
//激活接口所使用的一般异常,(这里随便在api里面找的)
try {
throw new ActivationException();
} catch (ActivationException e) {
//打印调用栈
e.printStackTrace();
}
}
这里还涉及到一个异常传递的问题,如果是编译时异常,则每层都会且必须显示处理这个异常。但是对于RuntimeException代码如下:
public class TestException {
static void testException() {
try {
throw new RuntimeException();
} catch (Exception e) {
System.out.println("捕获");
throw e;
}
}
static void testException2() {
testException();
System.out.println("正常执行");
}
public static void main(String[] args) {
try {
testException2();
} catch (Exception e) {
System.out.println("main中捕获");
}
}
}
对于上面这段代码,在testException方法中,显示的捕获了运行时异常,处理过后重新抛出,由于是运行时异常,所以不需要像编译时异常一样,必须在方法名后面加上throws 异常。如果在testException中在catch语句块中没有重新throw异常,则testException2中正常执行。如果在main函数中不显示的try catch 异常,则程序直接抛出异常到界面显示给用户。
这里还涉及到一个finally语句块,由于finally语句块程序在基本情况下都会在最后运行,一般用来释放掉一些必须释放掉的资源,如数据库连接等。这里注意一个事情,代码如下:
public class TestException {
static int test() {
int i = 0;
try {
throw new RuntimeException();
} catch (Exception e) {
System.out.println("捕获");
i = 5;
throw e;
} finally {
return i;
}
}
static void test2(){
int i = test();
System.out.println(i);
}
public static void main(String[] args) {
test2();
}
}
注意:如果在finally语句块中,使用return 语句,则在catch 语句块中重新抛出的异常就会失效。在外层调用test方法时,效果与在catch语句块中不重新抛出异常效果相同,test2方法正确执行。
如果finally语句块中不使用return 语句,在main方法中也没有显示的处理异常, 程序直接抛出异常。
现在finally语句块中使用return语句,就会导致异常抛出失效(throw e 失效) test2函数正常执行打印功能 打印 i= 5

浙公网安备 33010602011771号