java 關鍵字 assert的學習,javaassert

來源:互聯網
上載者:User

java 關鍵字 assert的學習,javaassert

之前在學習java源碼時,發現了assert這個不常用的關鍵字。下面直接來介紹下這個關鍵字的使用。

assert是什嗎?

它是jdk1.4之後新增加的關鍵字,沒了。

 

assert的作用是什嗎?

assert在很多程式設計語言中的用途都是斷言。

但是什麼是斷言呢?

只是簡單的判斷一下布林運算式是否為真嗎?

好,帶著這些問題,我們直入正題吧。

assert vt vt. 維護,堅持;斷言;主張;聲稱。

通過查看assert的翻譯,我們可以看到assert有主張、維護和堅持的意思。

也就是說,assert後邊所跟的條件(防盜串連:本文首發自http://www.cnblogs.com/jilodream/ )必須滿足,必須維護,否則就會出現錯誤。

 

assert的使用

assert的使用包含兩塊內容

(1)關鍵字在代碼中的使用:

assert 有兩種使用方法:

  1)assert BooleanCondition;

asssert後邊跟一個布林運算式。

如果運算式的值為true,那麼就認為當前條件符合要求,繼續執行業務代碼。

如果運算式的值為false,那麼久認為當前條件不符合要求,立即拋出AssertionError的錯誤。

AssertionError extends Error extends Throwable.Throw這個類,平常使用的相對較少,它還有一個子類叫做Exception。Error和Exception一樣,均屬於系統不應該試圖捕獲的嚴重問題。

  2)assert BooleanCondition:Excepiton

assert後邊跟一個布林運算式,同時再跟一個傳回值為基本類型的運算式。

當運算式為true時,則繼續運(防盜串連:本文首發自http://www.cnblogs.com/jilodream/ )行剩餘業務代碼,不會執行‘:’後邊的運算式。

當運算式為false時,則會執行‘:’後邊的運算式,並將結果放置在AssertionError異常中,並拋出。

下面給一個程式碼範例:

 1 public class assertStudy 2 { 3     public static void main(String args[])  4     { 5         assert 1 == 1; 6         System.out.println("A Go!"); 7         System.out.println("\n-----------------------------------------------\n"); 8         assert 1 != 1 : "Wrong"; 9         System.out.println("B Go!");10     }11 }

(2)關鍵字的有效性

在上述的assert處加入斷點,Debug調試時,發現斷點處根本沒有停頓,而是直接跳過了。

為什麼會這樣呢?這是因為assert關鍵字是受java啟動項配置的。

 

在啟動時 需要通過-ea將開關開啟

java -ea assertStudy

這樣我們就會看到assert行的斷點生效了(預設是不開啟的)。

而

java -da assertStudy,這樣assert就失效了

eclipse中開啟關鍵字有效性的方法如下:

 選擇菜單:Run--->Run...--->選擇Arguments選項卡

在VM arguments文字框中輸入:-ea 注意中間沒有空格,如果輸入 -da 表示禁止斷言

(如果找不到以上的路徑,請依次開(防盜串連:本文首發自http://www.cnblogs.com/jilodream/ )啟斷言: windows -> Preferences -> Java ->Installed JREs -> 點擊正在使用的JDK -> Edit -> Default VM Arguments 文字框中輸入:-ea)

 

論assert的必要性

通過assert的敘述,我們發現他和java中的if非常相似。那麼為什麼java還要添加這樣的一個關鍵字呢?並且還是在jdk1.4這樣一個後續版本中添加呢?

注意看assert的描述和拋出的異常是個Error。

即assert本意是對環境中,在正常使用的情況下,不會出現問題的條件判斷。這些代碼常常出現在基類、架構類、工具類等核心代碼中。而在這些代碼的正常運行中,是不會出現參數異常(防盜串連:本文首發自http://www.cnblogs.com/jilodream/ )的情境的。可是一旦通過反射,動態代理等方式使某些關索引值發生了改變,就會導致出現大量的異常情境。而如果我們為了保護這些情境而加入大量的基本不會生效的if判斷中,那麼這些基本不會起作用的if判斷,不但會嚴重的影響代碼的可讀性和簡潔,還使讀者覺得這些異常情境是會經常發生的,同時對系統的效能也有一定的影響。

而assert可以有效通過配置項,控制這段代碼是否生效,這其實上是一個非常優雅的行為。

ps 寫完本段後,感覺非常有電視購物的感覺....

其它的一些情況

1、-ea和-da可以有效指向到類和包路徑的某一級中,使得可以更加靈活的控制assert的有效性。具體的使用如下:

-ea java -ea 開啟所有使用者類的assertion

-da java -da 關閉所有使用者類的assertion

-ea: java -ea:MyClass1 開啟MyClass1的assertion

-da: java -da: MyClass1 關閉MyClass1的assertion

-ea: java -ea:pkg1 開啟pkg1包的assertion -da: java

-da:pkg1 關閉pkg1包的assertion

-ea:... java -ea:... 開啟預設包(無名包)的assertion

-da:... java -da:... 關閉預設包(無名包)的assertion

-ea:... java -ea:pkg1... 開啟pkg1包和其子包的assertion

-da:... java -da:pkg1... 關閉pkg1包和其子包的assertion

-esa java -esa 開啟系統類別的assertion

-dsa java -dsa 關閉系統類別的assertion

2、assert的使用,是你知道這個事情在正常的情況下是絕對不會發生的,但是你也知道,OS、jvm中的事情是會偶然出現莫名其妙錯誤的,同時保不準某個調用你代碼的人,和你想的不一樣,錯誤的調用了你的代碼。所以:

1)assert常被放置在使用者的核心處理代碼中,翻看java原始碼,你就會發現源碼中有大量的使用assert關鍵字。

2)assert處理的是那種正常情況下絕對不會出現的情況,所以在平常的商務程序中使用assert。

3)assert是不具有繼承性的

如果開啟父類的assert,則運行到子類的assert方法時,子類是預設不開啟的。

反之如果開啟子類的assert,運行到父類的assert方法時,父類的assert也是不開啟的。

 

參考文檔

http://blog.sina.com.cn/s/blog_95feae0d0101hhcg.html

http://lavasoft.blog.51cto.com/62575/43735

http://www.zhihu.com/question/24461924

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.