public Neocortex(Region rootRegion, ConnectionInterface functor) {
this.rootRegion = rootRegion;
this.currentRegion = this.rootRegion;
this.functor = functor;
}
嘿上面我有一个类的构造函数。我的问题是我应该在构造函数中添加空指针异常还是不必要?老实说,我只是不明白何时应该为我的代码添加例外。但在这种情况下,我应该使用哪个构造函数?
public Neocortex(Region rootRegion, ConnectionInterface functor) {
if (rootRegion == null) {
throw new NullPointerException("rootRegion cannot be null");
} else if (functor == null) {
throw new NullPointerException("functor cannot be null");
}
this.rootRegion = rootRegion;
this.currentRegion = this.rootRegion;
this.functor = functor;
}
答案 0 :(得分:3)
我会为构造函数的那些参数抛出一个IllegalArgumentException
,如果被接受,会导致一些不好的东西(包括但不限于null
参数)。也就是说,它会导致完成一个没有意义的物体的构造。
不要抛出NullPointerException
,因为您还没有尝试在某个null
上调用方法。
来自IllegalArgumentException
javadocs:
抛出以表明方法已被传递为非法或不恰当的参数。
如果null
不合适,则抛出IllegalArgumentException
。
答案 1 :(得分:3)
嗯......这是一个品味问题。
如果类的前提条件是必须提供rootRegion,那么保护类实现不需要在所有地方进行空检查是有意义的。
所以回答问题“我什么时候应该在构造函数中抛出异常”:我会在所有情况下都这样做,其中来自使用者的参数使您的实现处于无效状态,委托问题(即抛出除外)。
如果您尝试将角色作为消费者使用一段时间,并且您选择不进行空检查,则他将使用以下代码:
Neocortex n = new Neocortex(null,null);
n.doSomeething();
如果他到达第二行,并且这里的实现抛出一个NullPointerException,那么他将不清楚这是由于他提供的参数。
答案 2 :(得分:1)
是的,如果null
不是rootRegion
等的可接受值,则从构造函数中抛出NullPointerException
。从NullPointerException
documentation开始讨论JVM什么时候抛出它,但是也说:
应用程序应抛出此类的实例以指示
null
对象的其他非法用法。
你可以使用IllegalArgumentException
来获得对构造函数无效的更一般的参数情况,但NullPointerException
完全适用于参数的情况null
那不应该。但是,IllegalArgumentException
确实有一个优点,那就是明白错误的原因。 : - )
答案 3 :(得分:0)
在这个特定情况下,我会抛出一个IllegalArgumentException
,这对于您的班级用户来说意味着比NullPointerException
更多。
让构造函数抛出异常并不是一种坏习惯。但是,您应该确保它们有良好的文档记录(特别是在运行时异常的情况下),并且对调用者有意义。