8

我想知道是否有很多人在 Java 中使用断言进行编程。我认为这对于没有足够书面合同或过时合同的大型项目非常有用。特别是当您使用 Web 服务、组件等时。

但我从未见过任何使用断言的项目(JUnit/测试测试除外......)。

我注意到抛出的类是Error而不是Exception。他们为什么选择错误?可能是因为异常可能被意外捕获并且没有记录/重新抛出吗?

如果您使用组件开发应用程序,我想知道您将断言放在哪里:

  • 在组件方面,就在通过公共 API 返回数据之前?
  • 在组件客户端?如果 API 在任何地方都被调用,你会设置一个外观模式来调用断言机制吗?(那我猜你把你的断言和外观放在一些外部项目上,你的客户项目将依赖于这个断言项目?)

我了解如何使用断言以及何时使用它们,但只是想知道是否有些人有基于断言的真实体验的建议。

4

4 回答 4

5

顺便问一下,你指的assert是Java吗?

我个人发现断言对不变量特别有用。考虑到断言检查在 Java 中默认是关闭的。您必须添加-ea标志以启用断言检查。

换句话说,您可以在一种调试模式下测试您的应用程序,一旦断言被破坏,程序就会停止。另一方面,发布应用程序将关闭其断言,并且不会导致断言检查的时间损失。他们将被忽略。

在 Java 中,断言远没有异常强大,并且具有完全不同的含义。当意外发生并且您必须处理它时,就会出现例外情况。断言与代码的正确性有关。他们来这里是为了确认“应该”确实是这样。

我的粗略政策,尤其是在与许多开发人员合作时:

  • 公共方法:始终检查参数并在出现问题时抛出 IllegalArgumentException
  • 私有方法:使用断言检查空指针的参数等
  • 复杂方法:中间断言以确保中间结果满足请求的属性

...但实际上,我很少使用它们。就在关键或容易出错的地方。

于 2011-01-07T11:18:19.627 回答
4

关于断言的少量使用,我认为默认禁用断言是一个糟糕的决定。

关于扩展Error我想它扩展了Error因为Error是不希望被捕获的异常。这样,当您的代码中有catch(Exception)时,断言不会被缓存。

关于使用,最好的地方是在你想要检查的任何不变量的预编码、后置条件或代码中间。

于 2011-01-07T11:18:48.553 回答
1

在我看来,Java 中的错误应该被视为异常。因此,我将在开发和私有方法中启用断言,以检查我的代码是否运行良好,并且不会将无效值传递给私有方法。

由于这些检查应该在公共方法中进行,我不会再在私有方法中检查。

为了禁用断言:

-da flag in compiler

我认为,在公共方法中,您应该检查和管理异常或自己记录它们。

于 2011-01-07T11:18:51.200 回答
-1

断言不应该在测试之外使用,因为它们可以在生产环境中关闭,这可能由于缺乏适当的检查而导致严重的问题。

但是,我已经看到允许使用它们来检查私有方法中的参数的声明。那是因为您假设设法到达您的私有方法的数据是正确的,如果不是,应用程序可能会严重失败。

于 2011-01-07T11:19:10.997 回答