混乱 - 断言适当的用法

时间:2013-08-08 17:57:45

标签: java assertions

我正在从K& B练习考试中获取此代码片段。

public class Later {  
    public static void main(String[] args) {  
        boolean earlyExit = new Later().test1(args);  
        if (earlyExit) assert false;  // LINE 5  
        new Later().test2(args);  
    }  
    boolean test1(String[] a) {  
        if (a.length == 0) return false;  
        return true;  
    }  
    private void test2(String[] a) {  
        if (a.length == 2) assert false; // LINE 13  
    }  
}  

K& B中的答案指出,LINE-5和LINE-13不合适地使用断言。 我想知道为什么。这是我在阅读断言主题后的观察结果 K&安培; B

1.我明白,第5行是不合适的,因为它使用断言进行验证 命令行参数。永远不应该使用断言来验证命令行参数。

2.作为回答,它还指出,LINE 13也适用于断言。好的做法 在断言中声明,您可以使用断言来验证私有方法的参数。所以 我的问题是为什么LINE 13不适合使用断言。

对此的任何见解都会有所帮助。

2 个答案:

答案 0 :(得分:1)

断言用于检查代码不变量。您永远不应该使用断言进行输入验证,因为通常它们在运行时被禁用,这就是LINE 5不合适的原因。

问:断言主张我们可以使用断言来验证私有方法。

答:是的,您可以使用断言来验证私有方法的参数,因为它们对公众不可见 - 即如果断言失败则意味着在调用者的某处存在逻辑/程序员错误,但我建议使用if / else / exceptions构造。正如我上面所说,你永远不应该验证公共方法,因为在实践中每个人都可以向方法传递任何东西,如果断言被禁用,则会发生坏事:)

答案 1 :(得分:1)

Assertion(java中的断言关键字)用于验证代码,前提条件或后置条件中的不变量的正确性。它们用于测试您在代码中的假设,以捕获不一致的状态,并且通常是错误指示或不需要的流程执行。
断言被默认禁用,因为它们不应该投入生产并且未执行断言代码

public class AssertionTest {            
  private boolean productionCode(){
    System.out.println("Prodution code executed");
    return true;
  }

  private void assertion() {
    assert productionCode();
  }
}
启用断言输出的

是:

Prodution code executed

并且断言禁用输出是...... 没有 所以要小心

语法:

  1. assert <boolean expression>; 如果为false则抛出AssertionError
  2. assert <boolean expression> : <expression with value> 如果为false则抛出带有详细消息的AssertionError
  3. 在你的例子中

    private void test2(String[] a) {  
      if (a.length == 2) assert false; // LINE 13  
    }
    

    你正在以错误的方式使用它,因为正确的方法是

    private void test2(String[] a) {  
      assert (a.length != 2);   
    }
    

    表示:a必须有lenght不等于2其他是错误

    阅读here以获取Oracle文档。