java异常匹配原则
程序员文章站
2022-07-14 11:17:40
...
源:http://blog.csdn.net/butcher__/article/details/54837131
评:
java异常匹配有两个重要原则:
异常控制系统会按当前catch控制器的编写顺序来搜索,一旦找到相符的catch控制器,就认为异常已被捕获,不再进行更多的搜索。
catch控制器可以捕获当前异常类以及从它衍生的子类。
根据这两个原则,来做个测试,首先定义BusinessException和LoginException, BusinessException继承Exception, LoginException继承BusinessException。
class BusinessException extends Exception {
//empty
}
class LoginException extends BusinessException {
//empty
}
1
2
3
4
5
6
那么,LoginException只能捕获LoginException, BusinessException可以捕获LoginException和BusinessException, Exception可以捕获LoginException、BusinessException和Exception
Test1 :
try {
throw new LoginException();
} catch (LoginException le) {
System.out.println("LoginException catch");
} catch (BusinessException be) {
System.out.println("BusinessException catch");
} catch (Exception e) {
System.out.println("Exception catch");
}
//运行结果: LoginException catch
1
2
3
4
5
6
7
8
9
10
Test2 :
try {
throw new LoginException();
} catch (BusinessException be) {
System.out.println("BusinessException catch");
} catch (Exception e) {
System.out.println("Exception catch");
}
//运行结果: BusinessException catch
1
2
3
4
5
6
7
8
注意, 在catch控制器编写顺序中, 不要将父类异常位于子类异常之前,编译器会报错。因为永远无法执行到这个子类catch控制器。
评:
java异常匹配有两个重要原则:
异常控制系统会按当前catch控制器的编写顺序来搜索,一旦找到相符的catch控制器,就认为异常已被捕获,不再进行更多的搜索。
catch控制器可以捕获当前异常类以及从它衍生的子类。
根据这两个原则,来做个测试,首先定义BusinessException和LoginException, BusinessException继承Exception, LoginException继承BusinessException。
class BusinessException extends Exception {
//empty
}
class LoginException extends BusinessException {
//empty
}
1
2
3
4
5
6
那么,LoginException只能捕获LoginException, BusinessException可以捕获LoginException和BusinessException, Exception可以捕获LoginException、BusinessException和Exception
Test1 :
try {
throw new LoginException();
} catch (LoginException le) {
System.out.println("LoginException catch");
} catch (BusinessException be) {
System.out.println("BusinessException catch");
} catch (Exception e) {
System.out.println("Exception catch");
}
//运行结果: LoginException catch
1
2
3
4
5
6
7
8
9
10
Test2 :
try {
throw new LoginException();
} catch (BusinessException be) {
System.out.println("BusinessException catch");
} catch (Exception e) {
System.out.println("Exception catch");
}
//运行结果: BusinessException catch
1
2
3
4
5
6
7
8
注意, 在catch控制器编写顺序中, 不要将父类异常位于子类异常之前,编译器会报错。因为永远无法执行到这个子类catch控制器。