断言不起作用


问题内容

我正在尝试编写一个断言,以检查用户提供的大小是否为正值,如果不是,则使其为正,此语句位于类构造函数内部,该类构造函数采用大小值,然后生成array
[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);

谢谢山姆,


问题答案:

您需要使用-ea开关运行程序(启用断言),否则assertJVM将完全不运行任何指令。依靠断言有些危险。我建议你做这样的事情:

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];
}

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