断言不起作用

时间:2011-10-23 08:59:10

标签: java macos swing osx-snow-leopard

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

    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);

谢谢Sam,

3 个答案:

答案 0 :(得分:49)

您需要使用-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];
}

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

答案 1 :(得分:12)

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

请参阅Enabling and Disabling Assertions

简而言之,要在所有类(系统类除外)中启用断言,请在运行类时使用-enableassertions-ea切换。

答案 2 :(得分:2)

由于assert是JDK 1.4中引入的新Java关键字,因此必须使用JDK 1.4编译器编译该程序。此外,您需要在编译器命令中包含switch -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

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

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

不要在公共方法中使用断言进行参数检查。可以传递给公共方法的有效参数被视为方法合同的一部分。无论是启用还是禁用断言,都必须始终遵守合同。例如,应使用异常处理

重写上述代码