2011-04-16 58 views

回答

4

如果斷言在JVM中啓用(通過-ea標誌),斷言失敗時將拋出AssertionError

不應該被捕獲,因爲如果一個斷言失敗,它基本上意味着你對該程序如何工作是錯誤的假設之一。所以,當你得到一個用你的線程(也可能是整個程序)終止記錄的異常堆棧跟蹤時,你通常會發現斷言失敗。

0

它拋出一個Error。這就像當你得到一個NullPointerException,但它是java.lang.Error的一個子類。名字是AssertionError

這就像一個NullPointerException的意義,你不必聲明投擲或任何東西,它只是拋出它。

assert(false); 

就像

throw new AssertionError(); 

如果您運行與-ea標誌傳遞到Java程序(VM)程序。

1

如果斷言失敗並且在運行時啓用了斷言,將會拋出一個AssertionError
通常在JUnit測試中使用assert語句時,在構建應用程序時,您正在運行測試實用程序來檢查錯誤並告訴您。

看看這個:如果你啓用了在JVM中斷言,當它開始Programming With Assertions

+0

JUnit的斷言是普通的Java斷言不同。它們會引發不同的異常('AssertionFailedError'),並且不能用JVM標誌關閉。 – 2011-04-16 17:02:26

+0

你在混合兩件事。Java斷言的形式爲'assert * boolean expression *'或'assert * boolean expression *:* non-void expression *',並且在啓用時由運行時系統檢查。在JUnit測試中,像'assertEquals(a,b)'這樣的語句是JUnit類的方法調用。 – 2011-04-16 17:03:37

4

斷言只會失敗。您可以通過在命令行中指定參數-ea來完成此操作。如果你這樣做,那麼在執行時的代碼塊將拋出一個AssertionError

public void whatever() { 
    assert false; 
} 

斷言應該用來只檢測編程錯誤。如果您正在驗證用戶輸入或這些行上的某些內容,請勿使用斷言。

1

它引發一個AssertionError。 Howeveer,你必須用-ea或-enableassertions標誌編譯程序,讓它產生一個實際的異常

+3

不是編譯時選項。這是一個運行時選項。 – 2011-04-16 17:00:55

2

它拋出一個AssertionError這是Error的一個子類。作爲一個Error通常作爲一個失敗的斷言,特別是,你可能不應該試圖捕捉它,因爲它告訴你在你的代碼中有一個顯着的異常,並且如果你繼續,你可能會處於一個不確定的,不安全的狀態。

0

程序員可以編寫try catch塊,所以如果發生了錯誤,那麼它可以捕獲被捕獲並程序員可以來了解

try 
{ 
    assert false; 
} 
catch(Exception e) 
{ 
    System.out.println("Error has occured"); 
}