0

是的,有很多关于 Javaassert语句的问题和非常好的答案,以及何时应该使用异常。这个问题是关于一个特定的用例,该用例通常属于“从不使用assert以确保先决条件”的声音类别——或类似的词。所以,请再忍耐我一会儿……

默认情况下,所有 Java 对象引用都可以是null并且是null。除了仅引用实现中指定的值集之外,甚至enum引用也可以。因此,在大多数 Java 程序中都必须进行大量测试。其中一些测试包括检查给定 API 返回的值,该值表示不存在、打算由调用者处理的故障或其他一些状态信息。但是,大多数测试都意味着在发生意外时提前失败nullenumnullnullnullnull遇到。为了尽可能频繁地正确“提前失败”,同时还使用可执行代码作为自记录前提条件,可以使用引发异常的条件测试来检查不需要的null值。

但...

不需要的null值通常会导致 aNullPointerException在某个点被抛出,尽管它可能null在测试或调试应用程序时很容易确定其来源的点之后很长时间。因此,null值通常不会未被发现,只是错误使用的自我报告可能不是很有帮助。但是,无论异常是由于检测到意外事件null还是由于尝试取消引用而引起的,该异常几乎可以肯定是致命的,或者必须在完全消除导致任何致命异常的原因的级别上进行处理。

所以,一个不受欢迎的、无意的null最终会在某个时间点咬人。在最好的情况下,测试先决条件只是将该点移动到一个时间点,这可能使开发人员更容易找到问题的根源。但是,如果使用显式测试或异常来检查所有可能不需要的null值,无论多么不可能,这会导致编译代码中出现大量条件分支,其中预期的和公共分支是跳过引发异常的代码的分支.

鉴于所有这些以及 Java 对象引用的性质,似乎assert语句应该特别适用于排除null值的前提条件。在开发和测试中,先决条件被启用并有助于检测和修复缺陷。在生产中,来自意外null值的致命错误稍后会发生,但通常不会发生 - 在任何情况下都不能接受null值的关键代码总是可以使用显式测试并抛出异常,即使在assert其他地方使用也是如此。因此,assert对于这个常见且几乎无处不在的前提条件,使用可以限制生产代码中不必要的开销。

考虑到这一切,是否有合理的论据反对使用assert先决条件语句来专门记录和拒绝null无效参数、输入或状态的值?

4

1 回答 1

2

我认为默认情况下禁用 s 的事实assert足以阻止我将它们用于任何关键的事情。

于 2014-03-11T21:36:54.067 回答