【问题标题】:what is the use of assert in java [duplicate]java中断言的用途是什么[重复]
【发布时间】:2012-11-04 12:26:33
【问题描述】:

可能重复:
What does assert do?

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

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

class AssertExample {

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

【问题讨论】:

标签: java exception-handling assert


【解决方案1】:

assert 不是一种处理异常的方法,它是一种检测它们的方法。 (因此,您找到的描述对我来说似乎有点离题。)这基本上是一种说法:

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

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

请记住,捕获异常(这是正在使用的编程语言的构造)和有意义地处理异常(这是逻辑结构独立于所使用的语言)。仅捕获您可以实际 处理它们的异常。否则,让他们将堆栈冒泡到可以对他们做某事的其他代码。 (但由于assert 不会捕获错误,它会抛出错误,因此应该在您尝试使用它的确切位置使用它......甚至可以检测到错误的点如果无法处理。)

查看您使用assert 的尝试,看起来您已经接近了。这不是真正的正确用法:

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

您将assert 视为只是一个布尔值。然后,使用? : 运算符,您将关闭该布尔值以...好吧...实际上不做任何事情。只需将字符串("assertion failed""assertion passed")返回到不对该字符串执行任何操作的代码行。

关闭,但不完全。

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

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

这基本上是在说:

x 应该始终大于 0。如果不是,则说明有问题。停止执行任何操作并引发错误。

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

然后,在其他地方,您将处理 AssertionError 并以某种方式对其进行响应。

使用assert 非常类似于这样的东西,只是更短且更能表达其意图:

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

如您所见,assert 只是更简洁一点:

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

【讨论】:

  • @BhavikAmbani:对不起?你能更清楚你的意思吗?
【解决方案2】:

维基百科:

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

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

java -ea:pl.maciejziarko.service.UserService

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

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

【讨论】:

  • 如果您也用我的示例进行解释,我将不胜感激。 :-)
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2016-10-29
    • 2012-05-06
    • 2014-08-28
    • 2017-03-01
    相关资源
    最近更新 更多