天天看點

java assert(a==b)_Java assert關鍵字有什麼作用,什麼時候應使用?

小編典典

讓我們假設你應該編寫一個程式來控制核電站。很明顯,即使是最輕微的錯誤也可能導緻災難性的結果,是以你的代碼必須沒有錯誤(假設出于參數考慮,JVM是沒有錯誤的)。

Java不是可驗證的語言,這意味着:你無法計算出操作的結果是否完美。這樣做的主要原因是指針:它們可以指向任何地方或任何地方,是以無法計算出具有确切值的指針,至少不在合理的代碼範圍内。鑒于此問題,沒有辦法證明你的代碼總體上是正确的。但是你可以做的是證明你至少在發現每個錯誤時都會發現它。

這個想法是基于按合同設計(DbC)範式的:你首先(以數學精度)定義方法應該執行的操作,然後通過在實際執行過程中對其進行測試來進行驗證。例:

// Calculates the sum of a (int) + b (int) and returns the result (int).

int sum(int a, int b) {

return a + b;

}

盡管這顯然可以正常工作,但大多數程式員不會在其中發現隐藏的錯誤(提示:Ariane V因類似的錯誤而崩潰)。現在,DbC定義你必須始終檢查函數的輸入和輸出以驗證其是否正常工作。Java可以通過斷言來做到這一點:

// Calculates the sum of a (int) + b (int) and returns the result (int).

int sum(int a, int b) {

assert (Integer.MAX_VALUE - a >= b) : "Value of " + a + " + " + b + " is too large to add.";

final int result = a + b;

assert (result - a == b) : "Sum of " + a + " + " + b + " returned wrong sum " + result;

return result;

}

如果此功能現在失敗,你将注意到它。你将知道代碼中存在問題,知道問題出在哪裡,并且知道是什麼原因引起的(類似于Exceptions)。更重要的是:你會在發生錯誤時停止正确執行,以防止任何其他代碼使用錯誤的值運作,并可能損壞其控制的内容。

Java異常是一個類似的概念,但是它們無法驗證所有内容。如果要進行更多檢查(以執行速度為代價),則需要使用斷言。這樣做會使你的代碼膨脹,但是最終你可以在出乎意料的短開發時間内傳遞産品(越早修複錯誤,成本越低)。另外:如果你的代碼中有任何錯誤,你将對其進行檢測。沒有任何漏洞可以通過,并在以後引起問題。

這仍然不能保證沒有錯誤的代碼,但是比通常的程式更接近于此。

2020-03-04