2

可能重复:
断言有什么作用?

assert 在开发过程中测试程序员的假设,而不为异常编写异常处理程序这就是我在搜索assert时得到的。

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

class AssertExample {

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

3 回答 3

3

维基百科:

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

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

java -ea:pl.maciejziarko.service.UserService

关于断言的一些规则(来自 SCJP Sun Certified Programmer for Java 6 Study Guide):

  • 不要使用断言来验证公共方法的参数
  • 使用断言来验证私有方法的参数
  • 不要使用断言来验证命令行参数
  • 使用断言来检查你知道永远不会发生的情况
  • 不要使用可能导致副作用的断言表达式
于 2012-11-04T12:39:20.930 回答
3

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它只是更干净一点:

  • 使用特定关键字来提醒人们注意它检查条件的唯一目的是验证假设。Anif可能正在这样做,或者它可能出于任何其他原因分叉一条新的代码路径。
  • 引发特定错误,可以将其与其他错误分开。请注意我使用 aCustomException来做同样的事情,但AssertionError更常见/预期。
  • 使用更少的代码。
  • 演示真实条件,而不是相反或错误的条件。在大多数情况下,真实条件更容易阅读,并且更清楚地表达了代码的意图。
  • 遵循惯例并且更惯用。
  • 将代码与其他代码区分开来,以用于特定目的,向其他开发人员表明断言应该只是一个断言。(因此其他开发人员不应该将其修改为第二个代码路径,可能会给断言添加副作用。)
  • 可以很容易地为正在运行的应用程序全局打开或关闭。Java 允许您在任何给定的运行时上下文中启用或禁用断言检查。这对于将断言作为横切关注点进行全局管理非常方便。
于 2012-11-04T12:54:11.047 回答
0

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

它们往往被用作合同规定的一种穷人的设计。

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

于 2012-11-04T12:34:17.083 回答