3
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

4 回答 4

3

我会IllegalArgumentException为那些参数抛出一个构造函数,如果被接受,会导致一些不好的事情(包括但不限于一个null参数)。也就是说,它会导致一个没有意义的对象的完整构造。

不要抛出 a NullPointerException,因为你还没有尝试调用某个东西的方法null

IllegalArgumentExceptionjavadocs

抛出以指示方法已传递了非法或不适当的参数。

如果null不合适,则抛出IllegalArgumentException.

于 2013-05-16T17:20:49.967 回答
3

嗯......这是一个品味问题。

如果类的先决条件是必须提供 rootRegion,那么保护类实现免于到处进行空值检查是有意义的。

所以要回答“我什么时候应该在构造函数中抛出异常”的问题:我会在所有情况下这样做,即来自消费者的参数使您的实现处于无效状态,委托问题(即抛出异常)。

如果您尝试担任消费者角色一段时间,并且您选择不进行空检查,他将拥有如下代码:

Neocortex n = new Neocortex(null,null);
n.doSomeething();

如果他到达第 2 行,并且这里的实现抛出 NullPointerException,他将不清楚这是由于他提供的参数。

于 2013-05-16T17:30:52.927 回答
1

是的,如果等null不是可接受的值,则从构造函数中rootRegion抛出。NullPointerExceptionNullPointerException文档中,它谈到了 JVM 何时会抛出这个,但也说:

应用程序应抛出此类的实例以指示null对象的其他非法用途。

可以使用IllegalArgumentException对构造函数无效的参数的更一般情况,但对于不应该存在NullPointerException的参数的情况完全正确。不过,它确实有一个优势,就是非常清楚出了什么问题。:-)nullIllegalArgumentException

于 2013-05-16T17:22:04.860 回答
0

在这种特定情况下,我会抛出一个IllegalArgumentException,这对您班级的用户来说意味着比 a 更多NullPointerException

让构造函数抛出异常并不是一个坏习惯。但是,您应该确保它们是有据可查的(尤其是在运行时异常的情况下),并且对调用者有意义。

于 2013-05-16T17:23:30.277 回答