簡體   English   中英

關鍵字assert在java中意味着什么?

[英]what does the keyword assert means in java?

我在GWT代碼中找到了某個地方,就是這樣的


assert display instanceof Widget : "display must extend Widget";

顧名思義, assert關鍵字對代碼進行斷言 它用於指定一直保持為真的東西 - 或者至少應該是真的!

assert關鍵字后跟一個布爾值( truefalse ),或者在運行時計算的表達式,它返回一個布爾值。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM