Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 断言不起作用_Java_Macos_Swing_Osx Snow Leopard - Fatal编程技术网

Java 断言不起作用

Java 断言不起作用,java,macos,swing,osx-snow-leopard,Java,Macos,Swing,Osx Snow Leopard,我试图编写一个断言来检查用户给出的大小是否为正值,如果不是,则将其设为正值,该语句位于类构造函数中,该类构造函数接受大小值,然后生成一个数组[size]。我已经写了下面的代码,我相信是正确的 public Grid(int size) { try{ assert size > 0 ; } catch(AssertionError e){ size = Math.abs(size); } setLayout

我试图编写一个断言来检查用户给出的大小是否为正值,如果不是,则将其设为正值,该语句位于类构造函数中,该类构造函数接受大小值,然后生成一个数组[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,

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


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

您需要使用
-ea
开关(启用断言)运行程序,否则JVM根本不会运行
断言
指令。依靠断言有点危险。我建议你这样做:

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];
}
甚至像这样:

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];
}
公共网格(整数大小){
如果(尺寸<0){
抛出新的IllegalArgumentException(“无法创建负大小的网格”);
} 
setLayout(新网格布局(大小、大小));
网格=新的JButton[大小][大小];
}

第二个建议的好处是在代码的其他部分向您显示潜在的编程错误,而第一个建议会默默地忽略这些错误。这取决于您的用例。

由于assert是JDK1.4中引入的一个新Java关键字,因此您必须使用JDK1.4编译器编译程序。此外,您需要在编译器命令中包含switch–source 1.4,如下所示:

javac –source 1.4 AssertionDemo.java
java –ea AssertionDemo
注意:如果使用JDK1.5或更高版本,则无需在命令中使用–source 1.4选项

默认情况下,在运行时禁用断言。要启用它,请使用开关–enableassertions,或简称–ea,如下所示:

javac –source 1.4 AssertionDemo.java
java –ea AssertionDemo
断言可以在类级别或包级别有选择地启用或禁用。禁用开关为–disableassertions或简称–da

例如,下面的命令启用package1中的断言,禁用Class1类中的断言

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

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


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

Smashing stuff!,快速提问,这可以在java代码本身中启用,还是仅仅是一个命令行语句?它纯粹是命令行的一个开关:
java-ea com.foo.bar.MyClass
第一部分不好。如果有人将负数传递给构造函数,则很可能是因为存在错误,不应隐藏/静默更正此错误!另外,在编写这样的代码时,假设值可能与实际值不同@xoxox这正是我在回答的最后一句话中提到的:“第二个建议的好处是在代码的其他部分向您显示潜在的编程错误,而第一个建议会默默地忽略它们。这取决于您的用例。”。这意味着第二种解决方案更有利。介意解释一下否决票吗?“这取决于您的用例。”为什么您更喜欢第一个?