在Java生产代码中使用Junit Assert API是否可以?

14

我想为我的方法参数执行空值检查,比如参数不应该为null。在我的Java代码中使用类似这样的代码assertNotNull("Map should not be null", filePaths);可以吗?

if(filePaths == null){
  throw new IllegalArgumentException("Maps cannot be null");
}

为了让我的代码不受所有空检查的干扰,我想写一个自己的Validator类,并重载notNull方法。但是有没有现成且简单易用的东西可以避免重新发明轮子。

我唯一担心使用JUnitAssert是它会抛出AssertionError而不是IllegalArgumentException等。


3
为什么不使用Guava的Preconditions - Louis Wasserman
另一个选项是使用 Java 语言提供的 assert 关键字 - 例如,assert null!= filepaths:"Maps cannot be null"。这些检查可以在启动时打开或关闭。 - Andy Thomas
2
@AndyThomas:在公共方法中不要使用断言进行参数检查。来自文档。如果禁用了断言,它将永远不会被调用。 - Charu Khurana
@LouisWasserman:谢谢你的建议,我们目前还没有使用过 Guava,不过看起来值得一试。 - Charu Khurana
@Learner - 很好的观点。在一些特殊情况下,我已经为非公共方法使用了assert()。但通常最好坚持一个单一的方法,例如Louis建议使用Guava的前提条件。 - Andy Thomas
2个回答

13

如果您使用Java 7或以上版本,可以使用以下代码:

Objects.requireNonNull(filePaths, "Map should not be null");

即使使用空参数,我希望得到一个NullPointerException或IllegalArgumentException, 但不应该是AssertionError。


感谢您的回复。我们仍在使用Java 6,但很高兴知道它已经内置于Java 7中。 - Charu Khurana
@学习者,使用Java 6,你可以像已经指出的那样使用Guava Preconditions(它大致做的与Objects.requireNonNull相同)。 - assylias

11
不可以使用它。JUnit的断言方法会抛出AssertionError,在生产代码中抛出Error并不是一个好主意。根据javadoc的描述:
“Error是Throwable的子类,表示严重问题,合理的应用程序不应该尝试捕获。大多数这样的错误都是异常情况。ThreadDeath错误虽然是“正常”条件,但也是Error的子类,因为大多数应用程序不应该尝试捕获它。方法不需要在其throws子句中声明任何可能在方法执行期间但未被捕获的Error子类,因为这些错误是不应该发生的异常情况。也就是说,对于编译时检查异常,Error及其子类被视为未经检查的异常。”

即使我编写自己的验证,我在生产代码中仍然会抛出IllegalArgumentException。哦,你是指抛出“Exception”而不是“Error”。 - Charu Khurana
正确的做法是不要抛出错误,而不是异常。 - Matthew Farwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接