0

我正在从 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.作为回答,它还指出,第 13 行也是不恰当地使用断言。断言中的良好实践表明,您可以使用断言来验证私有方法的参数。所以我的问题是为什么第 13 行不恰当地使用断言。

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

4

2 回答 2

1

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

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

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

于 2013-08-08T18:02:44.817 回答
1

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

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

在你的例子中

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 否则是一个错误

在此处阅读Oracle 文档。

于 2013-08-08T18:25:50.457 回答