2011-03-22 107 views
0

问我有这样的代码片段的Java:上断言行为

import java.util.ArrayList; 
import java.util.List; 

public class AssertTest { 
    public static void main(String[] args) { 
     List<String> list = new ArrayList<String>(); 
     assert(list.add("test")); //<-- adds an element 

     System.out.println(list.size()); 
    } 
} 

输出:

0 

为什么输出列表是空的? assert如何在这里表现? 提前谢谢!

+0

是的,它的确如此。我只是激活了-ea标志并输出1. – Simon 2011-03-22 09:30:04

+0

ok - 'add()'返回一个布尔值。我不知道的东西,但我仍然不想知道。这种返回类型只是愚蠢的。如果'Collection'的子类型需要提供这样的功能,子类型可以添加一个新的方法。 – irreputable 2011-03-22 09:36:11

+0

当使用'HashSet '时,'add()'返回一个布尔值的事实可能会很有用。如果您尝试添加与集合中包含的哈希代码相同的哈希代码,那么add()方法将返回false。你也可以考虑'Collection '只允许'n'值。所以返回值是完全合理的。 – Simon 2011-03-24 11:59:51

回答

5

您应该使用-ea标志来启用断言...例如;

java -ea -cp . AssertTest 

而且使用断言副作用最不好的地方..需要启用

+1

加,绝对不要在应用程序中使用assert表达式的副作用! – rsp 2011-03-22 09:24:51

+0

是的,就是这样,thx – Simon 2011-03-22 09:30:29

0

你必须启用断言。即作为java -ea AssertTest

5

从不断言有副作用的东西。如果在没有启用断言的情况下运行(启用-ea),将不会执行list.add("test")

这是一个很好的习惯,从来不主张什么,但假的,如下:

if (!list.add("test")) { 
    assert false; 
    // Handle the problem 
} 
0

附带你的问题 - 断言不应该包含需要对你的程序的正确运行的代码,因为这将导致该正确的操作取决于是否启用断言。

0

assert方法检查布尔表达式是true还是false。如果表达式的计算结果为true,则不起作用。但是,如果它的计算结果为false,assert方法会打印堆栈跟踪,并且程序将中止。在此示例实现中,使用了字符串的第二个参数,以便可以打印错误原因。