1700449035
1700449036
我们知道,一个对象的创建要经过内存分配、静态代码初始化、构造函数执行等过程,对象生成的关键步骤是构造函数,那是不是也允许在构造函数中抛出异常呢?从Java语法上来说,完全可以在构造函数中抛出异常,三类异常都可以,但是从系统设计和开发的角度来分析,则尽量不要在构造函数中抛出异常,我们以三种不同类型的异常来说明之。
1700449037
1700449038
(1)构造函数抛出错误是程序员无法处理的
1700449039
1700449040
在构造函数执行时,若发生了VirtualMachineError虚拟机错误,那就没招了,只能抛出,程序员不能预知此类错误的发生,也就不能捕捉处理。
1700449041
1700449042
(2)构造函数不应该抛出非受检异常我们来看这样一个例子,代码如下:
1700449043
1700449044
class Person{
1700449045
1700449046
public Person(int_age){
1700449047
1700449048
//不满18岁的用户对象不能建立
1700449049
1700449050
if(_age<18){
1700449051
1700449052
throw new RuntimeException(“年龄必须大于18岁。”);
1700449053
1700449054
}
1700449055
1700449056
}
1700449057
1700449058
//看限制级的电影
1700449059
1700449060
public void seeMovie(){
1700449061
1700449062
System.out.println(“看限制级电影”);
1700449063
1700449064
}
1700449065
1700449066
}
1700449067
1700449068
这段代码的意图很明显,年龄不满18岁的用户根本不会生成一个Person实例对象,没有对象,类行为seeMovie方法就不可执行,想法很好,但这会导致不可预测的结果,比如我们这样引用Person类。
1700449069
1700449070
public static void main(String[]args){
1700449071
1700449072
Person p=new Person(17);
1700449073
1700449074
p.seeMovie();
1700449075
1700449076
/*其他的逻辑处理*/
1700449077
1700449078
}
1700449079
1700449080
很显然,p对象不能建立,因为是一个RuntimeException异常,开发人员可以捕捉也可以不捕捉,代码看上去逻辑很正确,没有任何瑕疵,但是事实上,这段程序会抛出异常,无法执行。这段代码给了我们两个警示:
1700449081
1700449082
加重了上层代码编写者的负担
1700449083
1700449084
捕捉这个RuntimeException异常吧,那谁来告诉我有这个异常呢?只有通过文档来约束了,一旦Person类的构造函数经过重构后再抛出其他非受检异常,那main方法不用修改也是可以通过测试的,但是这里就可能会产生隐藏的缺陷,而且还是很难重现的缺陷。
[
上一页 ]
[ :1.700449035e+09 ]
[
下一页 ]