是的,有很多关于 Javaassert
语句的问题和非常好的答案,以及何时应该使用异常。这个问题是关于一个特定的用例,该用例通常属于“从不使用assert
以确保先决条件”的声音类别——或类似的词。所以,请再忍耐我一会儿……
默认情况下,所有 Java 对象引用都可以是null
并且是null
。除了仅引用实现中指定的值集之外,甚至enum
引用也可以。因此,在大多数 Java 程序中都必须进行大量测试。其中一些测试包括检查给定 API 返回的值,该值表示不存在、打算由调用者处理的故障或其他一些状态信息。但是,大多数测试都意味着在发生意外时提前失败null
enum
null
null
null
null
遇到。为了尽可能频繁地正确“提前失败”,同时还使用可执行代码作为自记录前提条件,可以使用引发异常的条件测试来检查不需要的null
值。
但...
不需要的null
值通常会导致 aNullPointerException
在某个点被抛出,尽管它可能null
在测试或调试应用程序时很容易确定其来源的点之后很长时间。因此,null
值通常不会未被发现,只是错误使用的自我报告可能不是很有帮助。但是,无论异常是由于检测到意外事件null
还是由于尝试取消引用而引起的,该异常几乎可以肯定是致命的,或者必须在完全消除导致任何致命异常的原因的级别上进行处理。
所以,一个不受欢迎的、无意的null
最终会在某个时间点咬人。在最好的情况下,测试先决条件只是将该点移动到一个时间点,这可能使开发人员更容易找到问题的根源。但是,如果使用显式测试或异常来检查所有可能不需要的null
值,无论多么不可能,这会导致编译代码中出现大量条件分支,其中预期的和公共分支是跳过引发异常的代码的分支.
鉴于所有这些以及 Java 对象引用的性质,似乎assert
语句应该特别适用于排除null
值的前提条件。在开发和测试中,先决条件被启用并有助于检测和修复缺陷。在生产中,来自意外null
值的致命错误稍后会发生,但通常不会发生 - 在任何情况下都不能接受null
值的关键代码总是可以使用显式测试并抛出异常,即使在assert
其他地方使用也是如此。因此,assert
对于这个常见且几乎无处不在的前提条件,使用可以限制生产代码中不必要的开销。
考虑到这一切,是否有合理的论据反对使用assert
先决条件语句来专门记录和拒绝null
无效参数、输入或状态的值?