2010-09-27 43 views

回答

54

如果條件爲false,則Assert將引發運行時錯誤(AssertionError)。斷言爲您提供了簡化的記錄,檢查和強制執行代碼正確性標準的方式。好處是用於定義和操縱這些正確性條件的語言級鉤子。如果希望啓用或禁用它們(有關這是否是個好主意的爭論),可以從JVM命令行執行。下面的一些評論者指出,除非在調試模式下運行,否則默認情況下禁用斷言;我的做法是在我的包裝腳本中隨時添加「-ea」(啓用斷言)。即使在性能敏感的代碼中,對我來說,權衡權重有利於從斷言中獲得的安全/正確性信心。 Assertions at OracleAPI Description for AssertionError

注預期或意外故障(例外),這可能是你的控制之外,並且斷言失敗之間的區別 - 斷言失敗文件程序員的假設,並指示不正確的程序,而不是一個意外的外部條件或預期特殊情況。 如果發生斷言失敗,則解釋是程序員誤解或錯誤地表達了程序,而不是其他錯誤或失敗來源。在實踐中,我用它來記錄我做出的明顯或非顯而易見的假設,以及在我產生(特別是私人/內部)代碼時要執行的不變量,使我和他人清楚地知道爲什麼會做出這些假設,它們在哪裏製作,以及它們是否經過驗證。比同樣效果的評論好得多。這是向Design by Contract邁出的一小步。

有效Java項目#38「檢查參數的有效性」(Google Books,Amazon.com)提供了參數檢查與正確使用斷言之間區別的有用表述。

相關於SO:(Enabling assertions in netbeans),(Assertions vs. Exceptions),(Near duplicate, asking for examples),(Badly named, but very similar content

+10

想補充說,斷言在運行時默認是禁用的。有命令行開關(-enableassertions或-ea)可用於選擇性地啓用斷言。 – 2010-09-27 17:31:13

+2

我認爲你的意思是「在非調試代碼中禁用」而不是「在運行時禁用」。 – DJClayworth 2010-09-27 17:36:11

+0

使用Netbeans,我該如何堅持-ea? – Pete 2010-09-27 20:54:56

3

andersoj是正確的。只是爲了讓你知道,斷言的好處是你可以簡單地關閉它(如果你不在java命令行中傳遞-ea)。這個簡單的事情使他們完美的用於開發,當你想確保你沒有破壞自己的代碼。  

-2

您可以在開發過程中使用它來啓用某些功能,然後在活動網站上將其完全禁用。例如

... 
assert debug("xxx"); 
... 

static boolean debug(String format, Object... args){ print(...); return true; } 

調試語句將在活動站點上增加零開銷。

+6

你認爲這是一個好習慣嗎?我認爲最好使用一些Logger.debug()方法或類似的東西。 – 2010-09-27 18:55:47

+0

我認爲最常見的做法是擺脫這種事情,避免潛在的複雜方法調用。特別是如果有一些潛在的副作用(我會計算輸出到stdout作爲「副作用」)。 – andersoj 2010-09-27 20:04:55

0

準確地對您的問題:

Assert用於驗證語句的條件。

assert (some condition) 
Example : assert (6 < 7) // condition pass 
      assert (6 > 7) // throws AssertionException here 

大多數人使用斷言以下用例字符串:(但我個人不喜歡用斷言它):

assert (obj != null || obj.isEmpty() || ...) 

我比較喜歡使用谷歌番石榴是乾淨和服務目的:

Obj.isNullOrEmpty() 

更多信息:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html

3

它給你帶來了什麼好處?爲什麼你認爲它不值得使用?

將斷言用於強制檢查,正如其他人建議的是危險練習

當其他開發人員使用您的庫時會發生什麼?或者系統管理員或高級用戶忘記,或者更糟糕的是,在運行時使用-ea標誌來啓用斷言?你失去了所有這些檢查,就是這樣。

斷言是一種開發工具。該標誌的默認狀態是off的事實是一個死衚衕。

應用程序中的任何功能或優點都不應依賴於斷言。

作爲背景,assert在C/C++中的使用方式與從中提取功能的方式相同。在C/C++中,開發人員通常可以在編譯時通過#define DEBUG ...來啓用或禁用聲明。隨着C/C++生產代碼通常關閉此功能。

從概念上講,Java應該也是如此。在生產使用條件和例外。他們本質上是一回事。

相關問題