在java中使用assert有什么用

可能重复:
断言做了什么?

断言测试程序员在开发过程中的假设,而不为exception编写exception处理程序这是我得到的,当我在搜索断言时

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

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

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

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

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

请记住, 捕获exception(正在使用的编程语言的构造)和有意义地处理exception(这是一种独立于所使用语言的逻辑构造)之间存在显着差异。 只捕获可以实际执行某些操作的exception。 否则,让他们将堆栈冒泡到其他代码,这些代码可以对它们做些什么。 (但是因为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只是一点点清洁:

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

维基百科:

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

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

 java -ea:pl.maciejziarko.service.UserService 

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

  • 不要使用断言来validation公共方法的参数
  • 使用断言validation私有方法的参数
  • 不要使用断言来validation命令行参数
  • 请使用断言来检查您所知道的永远不会发生的案例
  • 不要使用可能导致副作用的断言表达式

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

它们往往被视为一种穷人的合同设计。

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