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允許您在任何給定的運行時環境中啓用或禁用斷言檢查。這對於全局管理斷言是一個交叉問題非常方便。
http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html – Guillaume
我不知道..但是,我發現這在谷歌上。你可以在這裏檢查此... http://wiki.answers.com/Q/What_does_the_assert_keyword_do_in_Java – Ravi