2011-03-22 106 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方法會打印堆棧跟蹤,並且程序將中止。在此示例實現中,使用了字符串的第二個參數,以便可以打印錯誤原因。