【问题标题】:Assertion not working断言不起作用
【发布时间】:2011-10-23 08:59:10
【问题描述】:

我正在尝试编写一个断言来检查用户给出的大小是否为正值,如果不是,则使其为正值,此语句位于类构造函数中,该构造函数获取大小值然后生成一个数组[大小] .我写了下面的代码,我认为它是正确的。

    public Grid(int size) {


    try{
        assert size > 0 ;
    }
    catch(AssertionError e){
        size = Math.abs(size);
    }

    setLayout(new GridLayout(size, size));
    grid = new JButton[size][size];
}

虽然我似乎从来没有评估我的断言并继续程序然后导致 NegativeArraySize 错误(我试图避免)

我也试过了

assert size>0;

并且程序无法停止负值..

我最近在 mac 上运行 java 时遇到了一些问题,所以我不知道我的代码是否正确,或者它是否只是那些奇怪的 mac 怪癖之一!并且应该只使用

size=Math.abs(size);

谢谢山姆,

【问题讨论】:

    标签: java macos swing osx-snow-leopard


    【解决方案1】:

    您需要使用-ea 开关(启用断言)来运行您的程序,否则JVM 根本不会运行assert 指令。依赖断言有点危险。我建议你这样做:

    public Grid(int size) {
        size = Math.max(0, size) 
        setLayout(new GridLayout(size, size));
        grid = new JButton[size][size];
    }
    

    甚至像这样:

    public Grid(int size) {
        if(size < 0) {
            throw new IllegalArgumentException("cannot create a grid with a negative size");
        } 
        setLayout(new GridLayout(size, size));
        grid = new JButton[size][size];
    }
    

    第二个建议的好处是可以向您显示代码其他部分的潜在编程错误,而第一个建议会默默地忽略它们。这取决于您的用例。

    【讨论】:

    • 粉碎的东西!,快速的问题,这可以在 java 代码本身中启用还是纯粹是一个命令行语句?
    • 纯粹是命令行的开关:java -ea com.foo.bar.MyClass
    • 第一部分很糟糕。如果有人将负数传递给构造函数,则很可能是由于错误,这不应该被隐藏/静默纠正!此外,在编写这样的代码时,假设值可能与实际值不同!
    • @xoxox 这正是我回答的最后一句中提到的内容:“第二个建议的好处是可以向您显示代码其他部分的潜在编程错误,而第一个建议会默默地忽略它们. 这取决于您的用例。”。这意味着第二种解决方案更有利。介意解释否决票吗?
    • “这取决于您的用例。”为什么你更喜欢第一个?
    【解决方案2】:

    断言可以在程序启动时启用或禁用,默认情况下是禁用的。

    Enabling and Disabling Assertions

    简而言之,要在除 System 类之外的所有类中启用断言,请在运行类时使用 -enableassertions-ea 开关。

    【讨论】:

      【解决方案3】:

      由于 assert 是 JDK 1.4 中引入的新 Java 关键字,因此您必须使用 JDK 1.4 编译器来编译程序。此外,您需要在编译器命令中包含开关–source 1.4,如下所示:

      javac –source 1.4 AssertionDemo.java
      

      注意:如果您使用 JDK 1.5 或更高版本,则无需在命令中使用 –source 1.4 选项。

      默认情况下,断言在运行时被禁用。要启用它,请使用开关--enableassertions,或简称--ea,如下所示:

      java –ea AssertionDemo
      

      可以在类级别或包级别选择性地启用或禁用断言。禁用开关是 –disableassertions 或简称 –da

      例如,以下命令启用包 package1 中的断言并禁用类 Class1 中的断言。

      java –ea:package1 –da:Class1 AssertionDemo
      

      不应使用断言来代替异常处理。异常处理处理程序执行期间的异常情况。断言是为了保证程序的正确性。异常处理解决了健壮性,断言解决了正确性。与异常处理一样,断言不用于正常测试,而是用于内部一致性和有效性检查。

      所以在这种情况下,最好的答案是异常处理。

      不要在公共方法中使用断言来检查参数。可以传递给公共方法的有效参数被认为是方法契约的一部分。无论断言是启用还是禁用,都必须始终遵守合同。比如上面的代码应该用异常处理重写

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 2021-03-05
        • 2022-11-10
        • 2020-01-10
        • 2014-07-16
        • 2018-12-12
        • 2012-09-30
        相关资源
        最近更新 更多