何时为构造函数抛出异常

时间:2013-05-16 17:18:43

标签: java exception constructor nullpointerexception

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;
}

4 个答案:

答案 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更多。

让构造函数抛出异常并不是一种坏习惯。但是,您应该确保它们有良好的文档记录(特别是在运行时异常的情况下),并且对调用者有意义。