![](/img/trans.png)
[英]What does the Java assert keyword do, and when should it be used?
[英]what does the keyword assert means in java?
我在GWT代碼中找到了某個地方,就是這樣的
assert display instanceof Widget : "display must extend Widget";
顧名思義, assert
關鍵字對代碼進行斷言 。 它用於指定一直保持為真的東西 - 或者至少應該是真的!
assert
關鍵字后跟一個布爾值( true
或false
),或者在運行時計算的表達式,它返回一個布爾值。
assert true;
assert 1 == 1;
如果由於任何原因,布爾表達式的計算結果為false,則拋出AssertionError
。
// this will throw an AssertionError:
int x = 1;
assert x == 2;
當您使用它時,您可以清楚地說明程序在給定點上的狀態,這可以使讀者更容易理解您的代碼。
有一種稱為程序合同的編程范例,其中代碼段生成關於前提條件的陳述,這些前置條件必須適用於它們才能正確執行,后置條件保證在執行后保持為真。 您可以使用assert
關鍵字來實現此目的。
例如,如果編寫一個計算數字平方根的方法,它只適用於大於或等於零的數字,並且保證結果滿足相同的條件:
public double sqrt(final double x) {
assert x >= 0 : "Cannot calculate the square root of a negative number!"
double result = ...;
assert result >= 0 : "Something went wrong when calculating the square root!"
return result;
}
斷言最有趣的方面是你可以要求編譯器將它們從字節碼中刪除 (通過-disableassertion
參數),這樣你就不會在生產運行時獲得任何性能損失。 由於這個確切的原因, 要評估的表達式不會引起副作用是至關重要的 ,也就是說,表達式應該看起來像純粹的數學函數。 否則,如果編譯器刪除了斷言,程序的行為可能會改變。
最后,如果將斷言編譯成字節碼,則可以通過軟件讀取它們,該軟件將自動生成試圖破壞代碼的測試。 之前發現錯誤會很有用!
assert關鍵字在1.4中引入(按照該鏈接獲得完整描述)。 如果不滿足條件,它是在運行時拋出異常的簡寫。
把它想象成
assert condition : message
如
if ( ! condition ) {
throw new AssertionError ( message ) ;
}
我們的想法是為開發人員提供一種簡單的方法來幫助用戶(在您的案例中為GWT API用戶)檢測常見錯誤/陷阱
當它被引入時, assert
語句變成了一個保留字,當舊代碼被重新編譯為I.4時,它引起了一些編譯問題。 特別是對於JUnit測試套件,其中有一個使用很多的assert()
方法。 JUnit通過用assertTrue()
替換assert來做出反應
assert關鍵字用於簡化用戶定義的異常。為了定義一個用戶定義的異常,我們必須通過先定義異常導致條件來創建我們自己的異常類,然后我們必須將它拋出到我們的程序中。 但是從java 1.5開始我們有一個關鍵字as assert,其中只有我們必須編寫assert(condition)如果condtion為true它會執行程序的其他部分,否則如果它為false則會創建AssertionError類的對象而我們有處理它。 所以不需要定義我們的userdefind錯誤。
以下文字(強調我的)清楚地解釋了各種形式的斷言:
斷言聲明有兩種形式。
第一個更簡單的形式是:
斷言Expression1;
其中Expression1是一個布爾表達式。 當系統運行斷言時,它會計算Expression1,如果為false,則拋出AssertionError而不顯示詳細消息。
斷言聲明的第二種形式是:
斷言Expression1:Expression2; (你的例子落在這里)
其中:Expression1是一個布爾表達式。 Expression2是一個具有值的表達式。 (它不能是聲明為void的方法的調用。)使用此版本的assert語句為AssertionError提供詳細消息。 系統將Expression2的值傳遞給相應的AssertionError構造函數,該構造函數使用值的字符串表示形式作為錯誤的詳細消息。
另外,請參閱以下oracle鏈接以獲取詳細信息: http : //docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html
這意味着如果display不是Widget類型的對象,您將獲得一個帶有斷言后面的文本字符串的AssertionError。 斷言有助於調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.