我一直认为在构造函数中抛出已检查的异常是不好的做法,或者至少是应该避免的。
这样做的原因是您无法执行此操作:
private SomeObject foo = new SomeObject();
相反,您必须执行此操作:
private SomeObject foo;
public MyObject() {
try {
foo = new SomeObject()
} Catch(PointlessCheckedException e) {
throw new RuntimeException("ahhg",e);
}
}
在我构建SomeObject的时候,我知道它的参数是什么,那么为什么我应该期望我把它包装在一个try catch中呢?啊,你说,但如果我从动态参数构造一个对象,我不知道它们是否有效。好吧,你可以...在将参数传递给构造函数之前对其进行验证。这将是很好的做法。如果您只关心参数是否有效,那么您可以使用TrafreArgumentException。
因此,与其抛出已检查的异常,不如执行
public SomeObject(final String param) {
if (param==null) throw new NullPointerException("please stop");
if (param.length()==0) throw new IllegalArgumentException("no really, please stop");
}
当然,在某些情况下,抛出一个已检查的异常可能是合理的。
public SomeObject() {
if (todayIsWednesday) throw new YouKnowYouCannotDoThisOnAWednesday();
}
但这种可能性有多大呢?