我有一个不允许null作为参数的方法。我应该检查方法中的参数是否为null并抛出IllegalArgumentException? 如果是的话,我将不得不在很多方法中实现该检查,它看起来很难看。 那么最好的方法是什么?
答案 0 :(得分:5)
嗯,这是个人偏好的问题。我会说:是的,你应该。如果您在第一次访问对象时发现存在问题而不是获得异常,则可能会更容易调试,可能在数千行之外的其他方法中。 (但抛出NullPointerException
代替IllegalArgumentException
。)
但你必须手动检查。当然,您可以编写辅助方法或使用Guava的Preconditions
:
public void test(final String string) {
Preconditions.checkNotNull(string); // will throw a NullPointerException if string is null
}
编辑:特别是如果你编写一个供他人使用的API,告诉人们你是否期望非空值或null是否合适是有帮助的。您可以使用位于{{@Nullable
,@Nonnull
(每个变量或字段),@ParametersAreNonnullByDefault
和@ParametersAreNullableByDefault
注释(每个类,包或方法)来执行此操作1}}(不是JDK的一部分)。
编辑2 :好的,为什么我建议使用NPE而不是IAE?首先,它是处理这个问题的标准方法。 JDK这样做,像Guava这样的重要库这样做,而且只有一本关于Java的书, Effective Java ,推荐它(第60项)。但我知道,这不是一个有效的论点。在@fabian提到的this answer中,@ Jason Cohen支持IAE。他的论点是:
javax.annotation
。其次,我不认为这些期望在这里是一个有效的论点。如果每个人都在null
论证上抛出NPE,那么这些期望就会改变。事实上很多人误解了一个行为并不意味着这种行为是错误的。null
值。由于NPE明确设计用于处理null
值,为什么选择IAE呢? ;)null
与非法值之间没有区别。 是的区别。说实话:我不喜欢这个。我非常感谢Ceylon的null
方法是null
类的唯一实例。 (在我的Java代码中,我通常使用Guava的Null
类来表示可以为空的变量。)但Java作者做出了明确的决定:Optional
是一个非常特殊的东西,与其他所有值不同。这就是它应该以不同方式处理的原因 - e。 G。有一个不同的例外。 IAE表示值存在问题:可能太短,太长,负,正,零。 NPE表明根本没有价值。我更喜欢NPE的另一个原因是一致的行为。从调用者的角度来看 - 假设我不知道方法实现 - 我必须假设一旦访问此参数,调用带有null
参数的方法将导致NPE。在手动检查时抛出NPE不会改变此行为。它只会改善引发异常的时刻。
此外,使用NPE允许我以非常简单的方法省略手动检查,例如: G:
null
答案 1 :(得分:1)
我参加派对有点晚了,但Java 1.7增加了Objects#requireNonNull
。
它只是一个简单的方法,如果参数为null,将抛出NullPointerException
。我个人比在逻辑本身内部失败要好得多,因为该方法不仅快速失败,而且不需要在多个varibales语句中猜测哪个变量为空。
该方法返回非null值,这对Setters和Constructors非常有用:
public Repot(Date reportDate, String message) {
this.reportDate = Objects.requireNonNul(reportDate);
this.message = Objects.requireNonNul(message);
}