我正在尝试编写一个断言来检查用户给出的大小是否为正值,如果不是则使其为正,此语句位于类构造函数内部,该构造函数接受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,
答案 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
断言不应该用于替换异常处理。异常处理处理程序执行期间的异常情况。断言是为了确保程序的正确性。异常处理解决了健壮性和断言的正确性。与异常处理一样,断言不用于正常测试,而是用于内部一致性和有效性检查。
所以在这种情况下,最好的答案是异常处理。
不要在公共方法中使用断言进行参数检查。可以传递给公共方法的有效参数被视为方法合同的一部分。无论是启用还是禁用断言,都必须始终遵守合同。例如,应使用异常处理
重写上述代码