2012-11-04 40 views
2

可能重複:
What does assert do?什麼是Java中使用斷言的

斷言測試在開發過程中程序員的假設,而無需編寫異常處理程序的異常這是我得到了什麼,當時我正在搜索聲稱

除此之外,人們也表示,這是異常處理的替代方案。 當您不想花時間編寫異常處理代碼時,斷言將會出現在圖片中。但是,我沒有得到工作和使用。任何人都解釋這個例子

class AssertExample { 

    public static void main(String[] args) { 
     int x = 0; 
     assert (x > 0) ? "assertion failed" : "assertion passed"; 
     System.out.println("finished"); 
    } } 
+0

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html – Guillaume

+0

我不知道..但是,我發現這在谷歌上。你可以在這裏檢查此... http://wiki.answers.com/Q/What_does_the_assert_keyword_do_in_Java – Ravi

回答

2

assert不是辦法手柄例外,它是一種方法來檢測他們。 (因此,你發現的描述對我來說看起來有點不合時宜。)這基本上是一種說法:

這應該是真的。如果不是,則拋出一個錯誤。

如何處理這個錯誤是一個完全不同的問題。您可以在檢測到它的函數中處理它,可以在調用它的函數中處理它,可以在應用程序級別的頂層處理它。

請記住, 捕獲異常(這是使用的編程語言的構造)和有意義地處理異常(這是一種與正在使用的語言無關的邏輯結構)之間存在顯着差異。只有抓住例外,你可以實際上一些關於他們的事情。否則,讓他們將堆棧中的代碼吸引到其他可以對其進行操作的代碼中。 (但是因爲assert不會捕獲錯誤,所以它會拋出錯誤,它應該正好用在您嘗試使用錯誤的地方......即使錯誤不可能是處理。)

看着你的嘗試使用assert,它看起來像你接近。這不是真正的正確用法:

assert (x > 0) ? "assertion failed" : "assertion passed"; 

你治療assert,彷彿這只是一個布爾值。然後,使用? :運算符,您將該布爾鍵切換爲...呃...並不真正做任何事情。只要將一個字符串("assertion failed""assertion passed")返回到對該字符串不起任何作用的一行代碼中。

關閉,但不完全。

assert本身不僅僅是檢查條件。它通過拋出錯誤或允許代碼路徑繼續來響應條件。它使用運算符:,但不作爲? :運算符的一部分。因此,我認爲你正在試圖做的是這樣的:

assert (x > 0) : "assertion failed"; 

這基本上是說:

x應始終大於0如果不是,東西是非常錯誤的。不要做任何事情並提出錯誤。

這將提高與消息"assertion failed"(其中,當然,你會希望有一個更有意義的和有用的信息,包括任何有用的運行信息,以取代有關被檢查的值來幫助您進行調試)的AssertionError

然後,在其他地方,您將處理該AssertionError並以某種方式對其作出響應。

使用assert非常類似這樣的事情,只有更短,多一點表現其意圖:

if (x <= 0) throw new CustomException("assertion failed"); 

正如你所看到的,assert只是在少許清潔劑,它:

  • 使用特定的關鍵字來提醒人們注意,它只是爲了驗證假設而檢查條件。 if可能會這樣做,或者由於任何其他原因它可能會分離新的代碼路徑。
  • 拋出其可以遠離其他錯誤待過濾的特定錯誤。請注意我使用CustomException做同樣的事情,但AssertionError是更常見的/預期的。
  • 使用較少的代碼。
  • 演示真條件,相對於逆或假的條件。在大多數情況下,真實條件更易於閱讀,並更清楚地表達代碼的意圖。
  • 遵循慣例,更地道。
  • 從代碼的其餘部分分開設置的代碼作爲用於特定的目的,指示其他開發人員斷言應該斷言。 (所以其他開發商不應該修改它作爲第二代碼路徑,很可能加重副作用的說法。)
  • 可以很容易地打開或關閉全球範圍內爲運行的應用程序。 Java允許您在任何給定的運行時環境中啓用或禁用斷言檢查。這對於全局管理斷言是一個交叉問題非常方便。
+0

複製粘貼!!!!!! –

+0

@BhavikAmbani:對不起?你能更清楚你的意思嗎? – David

0

斷言是用於在開發期間驗證有關您的代碼的假設。

他們往往被用作一種窮人的合同設計。

例如,我使用它們來驗證代碼的前/後條件和不變量。

3

百科:

在計算機編程中,斷言是放置在一個程序中的謂詞(真僞語句),表明開發商認爲,謂詞是始終在那個地方真的。斷言的使用有助於程序員設計,開發和推理程序。

您可以在運行時使用-ea開關啓用斷言。斷言也可以選擇

java -ea:pl.maciejziarko.service.UserService 

啓用斷言左右(對於Java 6的學習指南從SCJP Sun認證程序員)一些規則:

  • 不要使用斷言驗證參數的公共方法
  • 使用斷言來驗證私有方法的參數
  • 不要使用斷言來驗證命令行參數
  • 使用斷言來檢查個案t帽子您所知道的永遠,永遠 應該發生
  • 不要使用斷言表達式可引起副作用
+0

我會明白,如果你也和我的例子來解釋。 :-) – Ravi