断言不起作用

Sam*_*mer 29 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];
}
Run Code Online (Sandbox Code Playgroud)

虽然我似乎永远不会评估我的断言并继续该程序然后导致NegativeArraySize错误(我试图避免)

我也试过了

assert size>0;
Run Code Online (Sandbox Code Playgroud)

并且程序无法停止负值.

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

size=Math.abs(size);
Run Code Online (Sandbox Code Playgroud)

谢谢山姆,

Mat*_*att 51

您需要使用-ea开关运行程序(启用断言),否则assertJVM 根本不会运行任何指令.根据断言有​​点危险.我建议你这样做:

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

或者甚至像这样:

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];
}
Run Code Online (Sandbox Code Playgroud)

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


sti*_*vlo 12

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

请参阅启用和禁用断言

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