在java中使用assert有什么用

时间:2012-11-04 12:26:33

标签: java exception-handling assert

  

可能重复:
  What does assert do?

断言在开发期间测试程序员的假设,而不为异常编写异常处理程序当我搜索断言时,这就是我得到的。

除此之外,人们还说,它是异常处理的替代方案。当您不想花时间编写异常处理代码时,断言将会出现。但是,我没有得到工作和使用。有人解释这个例子。

class AssertExample {

    public static void main(String[] args) {
        int x = 0;
        assert (x > 0) ? "assertion failed" : "assertion passed";
        System.out.println("finished");
    } }

3 个答案:

答案 0 :(得分:3)

百科:

  

在计算机编程中,断言是放置在程序中的谓词(真假语句),表示开发人员认为谓词在该位置始终为真。断言的使用有助于程序员设计,开发和推理程序。

您可以使用-ea开关在运行时启用断言。断言也可以有选择地启用

java -ea:pl.maciejziarko.service.UserService

关于断言的一些规则(来自SCJP Sun认证程序员Java 6学习指南):

  • 不要使用断言来验证公共方法的参数
  • 使用断言验证私有方法的参数
  • 不要使用断言来验证命令行参数
  • 使用断言来检查您从未知道过的案例 应该发生
  • 不要使用可能导致副作用的断言表达式

答案 1 :(得分:2)

assert不是处理异常的一种方法,它是检测它们的一种方式。 (因此,你发现的描述对我来说似乎有点不合适。)这基本上是一种说法:

  

这应该是真的。如果不是,则抛出错误。

如何处理该错误是一个完全不同的问题。您可以在检测到它的函数中处理它,您可以在调用它的函数中处理它,您可以在应用程序级别的堆栈顶部处理它等等。

请记住,捕获异常(它是正在使用的编程语言的构造)和有意义地处理异常(这是一个异常)之间存在显着差异逻辑构造独立于所使用的语言)。只捕获您可以某些事情的例外情况。否则,让他们将堆栈冒泡到其他可以对其进行操作的代码。 (但是由于assert没有捕获错误,它会抛出它们,它应该被用在你试图使用它的地方......可以检测到错误的点 ,即使它不能处理。)

看看你尝试使用assert,看起来你很接近。这不是正确的用法:

assert (x > 0) ? "assertion failed" : "assertion passed";

你正在对assert进行处理,好像它只是一个布尔值。然后,使用? :运算符,你将该布尔值键入......好吧......并没有真正做任何事情。只需将字符串("assertion failed""assertion passed")返回到不对该字符串执行任何操作的代码行。

关闭,但不完全。

assert本身不只是检查条件。它通过抛出错误或允许代码路径继续来响应条件。它使用:运算符,但不是? :运算符的一部分。所以我认为你要做的是:

assert (x > 0) : "assertion failed";

这基本上是在说:

  

x应该总是大于0.如果不是,那就是非常错误。停止做任何事情并引发错误。

这将使用AssertionError消息引发"assertion failed"(当然,您希望将其替换为更有意义且更有用的消息,包括有关正在检查的值的任何有用的运行时信息帮助你调试。)

然后,在其他地方,你会处理AssertionError并以某种方式回应它。

使用assert与此类似的东西非常相似,只是更短,更具表现力:

if (x <= 0) throw new CustomException("assertion failed");

正如您所看到的,assert只是更加清晰:

  • 使用特定的关键字来引起注意它正在检查条件的唯一目的是验证假设。 if可能正在执行此操作,或者出于任何其他原因可能会出现新的代码路径。
  • 引发特定错误,可以将其与其他错误区分开来。请注意我使用CustomException执行相同的操作,但AssertionError更常见/期望。
  • 使用较少的代码。
  • 证明真实条件,而不是反向或虚假条件。在大多数情况下,真实条件更容易阅读,更清楚地表达了代码的意图。
  • 遵循惯例,更为惯用。
  • 将代码与其余代码区分开来用于特定目的,向其他开发人员指出断言应断言。 (因此其他开发人员不应将其修改为第二个代码路径,可能会为断言添加副作用。)
  • 可以非常轻松地为正在运行的应用程序全局打开或关闭。 Java允许您在任何给定的运行时上下文中启用或禁用断言检查。这对于全球管理断言是一个非常方便的交叉问题。

答案 2 :(得分:0)

断言用于在开发期间验证有关代码的假设。

他们倾向于通过合同被用作穷人的设计。

例如,我使用它们来验证前/后条件和代码的不变量。