断言不起作用

2022-09-01 00:53:10

我正在尝试编写一个断言来检查用户给出的大小是否为正值,如果不是,则将其设为正值,此语句位于类构造函数内部,该构造函数采用大小值,然后创建一个数组[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];
}

虽然我似乎从未评估过我的断言并继续程序,然后导致负数组大小错误(我试图避免)

我也试过了

assert size>0;

并且程序无法停止负值。

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

size=Math.abs(size);

谢谢山姆,


答案 1

您需要使用交换机运行程序(启用断言),否则 JVM 根本不会运行任何指令。依赖于断言有点危险。我建议你做这样的事情:-eaassert

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

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


答案 2

断言可以在程序启动时启用或禁用,默认情况下处于禁用状态。

请参见启用和禁用断言

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