【问题标题】:Using assertion in main() method在 main() 方法中使用断言
【发布时间】:2015-03-10 11:35:19
【问题描述】:

这是我试图回答的一个问题:

以下哪些正确使用了断言?

public class Hunt {
  public static void main(String... args) {
      int y = 10;
      assert y > 5; // #1
      new Hunt().netant(y);
  }

  public void netant(int x) {
      assert x > 0; // #2
      anteater(x);
  }

  private void anteater(int x) {
      assert x > 0; // #3
  }
}

选择:2

选项

  1. #1
  2. #2
  3. #3
  4. 尽管正确使用了断言,但程序存在运行时错误

正确答案:1 & 3

说明:不建议使用断言来断言公共方法的参数

来源:http://www.certpal.com

答案指出“不建议使用断言来断言公共方法的参数”。但是在上面的代码中,即使 assert 语句用于断言 main() 方法的参数,它也被选为正确答案!

在 main() 方法中使用 assert 语句是否可取?

【问题讨论】:

  • no.... assert 只能在测试类中使用
  • 那么选项1是正确的?
  • 断言语句不是用于断言main() 的参数,而是在main() 内的字段上使用,尽管作为@PhilippSander 你只会在测试期间使用断言——你不会依赖它来正常检查数据。
  • 没有一个是正确的。在第一种情况下,它完全没有意义,因为它只是断言代码刚刚完成的某些事情。在其他情况下,它应该是适当的运行时检查,而不是只会让用户感到害怕的东西。

标签: java assertions


【解决方案1】:

断言是编码错误的防御机制。在公共方法中输入无效参数是用户错误,即使它是程序员正在使用的 API。

用户不应该看到断言,测试应该。

【讨论】:

    【解决方案2】:

    不建议使用断言来断言公共方法的参数y 不是参数。

     public static void main(String... args) {
            int y = 10;
            assert y > 5; // #1
            new Hunt().netant(y);
     }
    

    但是,以下不是一个好的做法:

     public static void main(String... args) {
        assert args.length==42;
     }
    

    【讨论】:

      【解决方案3】:

      Assertions 不应该用于:

      • 公共方法中的参数检查
      • 执行应用程序正确运行所需的任何工作

      • #1:检查局部变量的值。用断言检查 main 方法的参数不是正确的用法,但检查局部变量是有效的。
      • #2:检查公共方法的参数。断言使用无效。
      • #3:检查私有方法的参数。该类控制 方法调用中使用的参数,因此这是有效的用法。

      【讨论】:

        猜你喜欢
        • 2020-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-26
        相关资源
        最近更新 更多