Java中的斷言assert
Java陷阱之assert關鍵字
一、概述
在C和C++語言中都有assert關鍵,表示斷言。
在Java中,同樣也有assert關鍵字,表示斷言,用法和含義都差不多。
二、語法
在Java中,assert關鍵字是從JAVA SE 1.4 引入的,為了避免和老版本的Java程式碼中使用了assert關鍵字導致錯誤,Java在執行的時候預設是不啟動斷言檢查的(這個時候,所有的斷言語句都 將忽略!),如果要開啟斷言檢查,則需要用開關-enableassertions或-ea來開啟。
assert關鍵字語法很簡單,有兩種用法:
1、assert <boolean表示式>
如果<boolean表示式>為true,則程式繼續執行。
如果為false,則程式丟擲AssertionError,並終止執行。
2、assert <boolean表示式> : <錯誤資訊表示式>
如果<boolean表示式>為true,則程式繼續執行。
如果為false,則程式丟擲java.lang.AssertionError,並輸入<錯誤資訊表示式>。
三、應用例項
下面給出一個例子,通過例子說明其用法:
public class AssertFoo {
public static void main(String args[]) {
//斷言1結果為true,則繼續往下執行
assert true;
System.out.println(“斷言1沒有問題,Go!”);
System.out.println("\n-----------------\n");
//斷言2結果為false,程式終止
assert false : "斷言失敗,此表示式的資訊將會在丟擲異常的時候輸出!";
System.out.println("斷言2沒有問題,Go!");
}
}
儲存程式碼到C:\AssertFoo.java,然後按照下面的方式執行,檢視控制檯輸出結果:
1、編譯程式:
C:>javac AssertFoo.java
2、預設執行程式,沒有開啟-ea開關:
C:>java AssertFoo
斷言1沒有問題,Go!
斷言2沒有問題,Go!
3、開啟-ea開關,執行程式:
C:>java -ea AssertFoo
斷言1沒有問題,Go!
Exception in thread “main” java.lang.AssertionError: 斷言失敗,此表示式的資訊將
會在丟擲異常的時候輸出!
at AssertFoo.main(AssertFoo.java:10)
四、陷阱
assert關鍵字用法簡單,但是使用assert往往會讓你陷入越來越深的陷阱中。應避免使用。筆者經過研究,總結了以下原因:
1、assert關鍵字需要在執行時候顯式開啟才能生效,否則你的斷言就沒有任何意義。而現在主流的Java IDE工具預設都沒有開啟-ea斷言檢查功能。這就意味著你如果使用IDE工具編碼,除錯執行時候會有一定的麻煩。並且,對於Java Web應用,程式程式碼都是部署在容器裡面,你沒法直接去控制程式的執行,如果一定要開啟-ea的開關,則需要更改Web容器的執行配置引數。這對程式的移 植和部署都帶來很大的不便。
2、用assert代替if是陷阱之二。assert的判斷和if語句差不多,但兩者的作用有著本質的區別:assert關鍵字本意上是為測試 除錯程式時使用的,但如果不小心用assert來控制了程式的業務流程,那在測試除錯結束後去掉assert關鍵字就意味著修改了程式的正常的邏輯。
3、assert斷言失敗將面臨程式的退出。這在一個生產環境下的應用是絕不能容忍的。一般都是通過異常處理來解決程式中潛在的錯誤。但是使用斷言就很危險,一旦失敗系統就掛了。
五、對assert的思考
因此,應當避免在Java中使用assert關鍵字,除非哪一天Java預設支援開啟-ea的開關,這時候可以考慮。對比一下,assert能給你帶來多少好處,多少麻煩,這是我們選擇是否使用的的原則。
最新2020整理收集的一些高頻面試題(都整理成文件),有很多幹貨,包含mysql,netty,spring,執行緒,spring cloud、jvm、原始碼、演算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友請加Q君樣:909038429
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天
相關文章
- 斷言(ASSERT)的用法
- 【Node斷言assert】
- Nodejs 斷言 assertNodeJS
- SpringBoot(20)---斷言(Assert)Spring Boot
- python斷言方法assertPython
- 【pytest系列】- assert斷言的使用
- Java 斷言 Assert 使用教程與最佳實踐Java
- Python assert斷言函式及用法Python函式
- Nodejs教程11:assert(斷言)模組NodeJS
- node assert斷言 ——暫沒啥用處
- Python全棧開發之—assert斷言Python全棧
- Pytest學習筆記4-assert斷言筆記
- 防禦式程式設計之斷言assert的使用程式設計
- javascript單元測試框架mocha 和 斷言庫 assertJavaScript框架
- C++中的assertC++
- python 中assert的使用Python
- 淺析Java斷言Java
- C語言解讀assert函式C語言函式
- JavaScript中if巢狀assert的方法JavaScript巢狀
- Solidity中的assert()、require()與revert()SolidUI
- 用Assert(斷言)封裝異常,讓程式碼更優雅(附專案原始碼)封裝原始碼
- JavaScript中不得不說的斷言?JavaScript
- 十二、Jmeter 斷言-響應斷言、Json 斷言和 Beanshell 斷言JMeterJSONBean
- Java執行緒的中斷Java執行緒
- assert
- Node assert 的用法
- TestNg中的斷言你真的瞭解嗎
- Java中斷機制Java
- 組合語言--單步中斷組合語言
- 豐富 pytest 的 assert
- Java的Interrupt與執行緒中斷Java執行緒
- Solidity語言學習筆記————26、Assert, Require, Revert 和 ExceptionsSolid筆記UIException
- 肯定賦值斷言與非空斷言賦值
- junit 測試中各種斷言用法
- 斷言操作
- appium 自動化中關於斷言問題,有沒有更好的斷言方法,求大神賜教!APP
- Locust 斷言的實現?
- 優雅且語義化的斷言之—將模型屬性斷言變為模型方法斷言模型