【问题标题】:Java Assertion QuestionJava 断言问题
【发布时间】:2011-04-16 16:51:27
【问题描述】:

当 Java 断言失败时究竟会发生什么?程序员如何知道断言失败了?

谢谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    如果在 JVM 中启用了断言(通过 -ea 标志),断言失败时将抛出 AssertionError

    不应该被抓住,因为如果一个断言失败,它基本上意味着你对程序如何工作的假设之一是错误的。因此,当您在线程(可能还有整个程序)终止时记录异常堆栈跟踪时,您通常会发现断言失败。

    【讨论】:

      【解决方案2】:

      只有在启动时在 JVM 中启用了断言,断言才会失败。您可以通过在命令行中指定参数 -ea 来做到这一点。如果你这样做了,那么这段代码在执行时会抛出一个AssertionError

      public void whatever() {
         assert false;
      }
      

      断言只能用于检测编程错误。如果您在这些行上验证用户输入或其他内容,请不要使用断言。

      【讨论】:

        【解决方案3】:

        它抛出一个AssertionError,它是Error 的子类。作为一个Error,特别是作为一个失败的断言,你可能不应该试图抓住它,因为它告诉你代码中有一个明显的异常,如果你继续,你可能会处于一些未定义的、不安全的状态.

        【讨论】:

          【解决方案4】:

          如果断言失败并且在运行时启用了断言,它将抛出AssertionError
          通常您在 JUnit 测试中使用断言语句,在构建应用程序时,您正在运行一个测试实用程序,该实用程序将检查错误并告诉您。

          看看这个:Programming With Assertions

          【讨论】:

          • JUnit 断言不同于普通的 Java 断言。它们会导致抛出不同的异常 (AssertionFailedError),并且无法使用 JVM 标志关闭。
          • 你混合了两件事。 Java 断言的形式为 'assert boolean expression' 或 'assert boolean expression : non-void expression ' 并由运行时系统检查启用。在 JUnit 测试中,像“assertEquals(a,b)”这样的语句是 JUnit 类的方法调用。
          【解决方案5】:

          它抛出一个 AssertionError。但是,您必须使用 -ea 或 -enableassertions 标志编译程序才能使其生成实际异常

          【讨论】:

          • 不是编译时选项。这是一个运行时选项。
          【解决方案6】:

          它抛出一个Error。就像你得到一个NullPointerException 一样,但它是java.lang.Error 的一个子类。名字是AssertionError

          就像NullPointerException,你不必声明 throws 或任何东西,它只是抛出它。

          assert(false);
          

          就像

          throw new AssertionError();
          

          如果您使用传递给 java 程序 (VM) 的 -ea 标志运行程序。

          【讨论】:

            【解决方案7】:

            程序员可以编写try catch块,如果发生错误,可以在catch中捕获,程序员可以知道

            try
            {
              assert false;
            }
            catch(Exception e)
            {
              System.out.println("Error has occured");
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多