java之assert關鍵字用法案例詳解
Java2在1.4中新增了一個關鍵字:assert。在程序開發(fā)過程中使用它創(chuàng)建一個斷言(assertion)。,它的語法形式有如下所示的兩種形式:
1、assert condition;
這里condition是一個必須為真(true)的表達式。如果表達式的結果為true,那么斷言為真,并且無任何行動
如果表達式為false,則斷言失敗,則會拋出一個AssertionError對象。這個AssertionError繼承于Error對象,
而Error繼承于Throwable,Error是和Exception并列的一個錯誤對象,通常用于表達系統(tǒng)級運行錯誤。
2、asser condition:expr;
這里condition是和上面一樣的,這個冒號后跟的是一個表達式,通常用于斷言失敗后的提示信息,說白了,它是一個傳到AssertionError構造函數的值,如果斷言失敗,該值被轉化為它對應的字符串,并顯示出來。
用一個例子說明一下:
public class Test { public static void main(String[] args) { System.out.println("start"); assert true; System.out.println("go on"); assert false:"stop"; System.out.println("end"); } }
這里有一個測試類,通過之前簡單的語法介紹后,可以這樣簡單的理解這個例子:
當程序運行到assert true這一句時,condition為true,系統(tǒng)會繼續(xù)執(zhí)行下去。而后執(zhí)行到 assert false:"stop"的時候,由于condition=false,系統(tǒng)會拋出AssertionError。
但是試試上是不是這樣的呢?
看看運行結果就知道了
start
go on
end
這個運行結果和我們一開始的預期不一致,問題出在哪里了?
原來java的斷言與C語言中的斷言還有有些不同的地方。
Java的assertion的開啟也和C語言不太一樣,在C語言中,assertion的開啟是在編譯時候決定的。當我們使用debug方式編譯程序時候,assertion被開啟,而使用release方式編譯時候,assertion自動被關閉。 而Java的assertion卻是在運行的時候進行決定的。其實,這兩種方式是各有優(yōu)缺點。如果采用編譯時決定方式,開發(fā)人員將處理兩種類型的目標碼,debug版本和release版本,這加大了文檔管理的難度,但是提高了代碼的運行效率。 Java采用運行時決定的方式,這樣所有的assertion信息將置于目標代碼 中,同一目標代碼可以選擇不同方式運行,增強目標代碼的靈活性,但是它將犧牲因為assertion而引起一部分性能損失。
說直白一點就是:assert關鍵字需要在運行時候顯式開啟才能生效,否則你的斷言就沒有任何意義。
如果需要觀察斷言的運行情況,就需要打開系統(tǒng)類的assertion功能 ,我們可使用-esa參數打開,使用 -dsa參數關閉。 -esa和-dsa的全名為-enablesystemassertions和 -disenablesystemassertions,全名和縮寫名有同樣的功能。
我們還是用剛剛那個測試方法,再執(zhí)行試試看:
當我們只是通過java命令編譯、執(zhí)行測試方法時,并沒有執(zhí)行assert語句;然而通過java -ea Test命令顯示打開assertion功能后,發(fā)現(xiàn)系統(tǒng)確實執(zhí)行了assert語句。
另外,我們注意到體統(tǒng)拋出的是AssertionError,作為Error的一個子類,而不是 RuntimeException。Error代表一些異常的錯誤,通常是不可以恢復的,而 RuntimeException強調該錯誤在運行時才發(fā)生的特點。AssertionError通常為非常關鍵的錯誤,這些錯誤往往是不容易恢復的,而且assertion機制也不鼓勵程序員對這種錯誤進行恢復。
通過這個實驗的現(xiàn)象,可以引發(fā)一些思考:
1.assert需要顯示的開啟生效才有作用。
這就意味著你如果使用IDE工具編碼,調試運行時候會有一定的麻煩,因為基本上java IDE都是沒有開啟斷言功能的。并且,對于Java Web應用,程序代碼都是部署在容器里面,你沒法直接去控制程序的運行,如果一定要開啟-ea的開關,則需要更改Web容器的運行配置參數。這對程序的移植和部署都帶來很大的不便。
2.assert斷言失敗將面臨程序的退出。這在一個生產環(huán)境下的應用是絕不能容忍的。一般都是通過異常處理來解決程序中潛在的錯誤。但是使用斷言就很危險,一旦失敗系統(tǒng)就掛了。
3.即使處理了Error,如果斷言的代碼嵌入到業(yè)務流程中,一旦assert失效,也就改變了正常的業(yè)務邏輯(如果condition中加入了賦值等操作)。
我想可能就是這些原因導致平時的java開發(fā)中幾乎不會用到assert關鍵字,即便如此,JDK中還是存在不少使用assert的地方,比方說java.util.Locale類等
4.是不是可用通過封裝一些方法,自己來完成斷言的功能,既使用簡單,又方便理解。至少我是這樣做的。
到此這篇關于java之assert關鍵字用法案例詳解的文章就介紹到這了,更多相關java之assert關鍵字用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java輕松掌握面向對象的三大特性封裝與繼承和多態(tài)
本文主要講述的是面向對象的三大特性:封裝,繼承,多態(tài),內容含括從封裝到繼承再到多態(tài)的所有重點內容以及使用細節(jié)和注意事項,內容有點長,請大家耐心看完2022-05-05JAVA基于PDF box將PDF轉為圖片的實現(xiàn)方法
這篇文章主要介紹了JAVA基于PDF box將PDF轉為圖片的操作方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07spring AOP代理執(zhí)行@EnableAspectJAutoProxy的exposeProxy屬性詳解
這篇文章主要為大家介紹了spring AOP代理執(zhí)行@EnableAspectJAutoProxy的exposeProxy屬性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Springboot配置管理Externalized?Configuration深入探究
這篇文章主要介紹了Springboot配置管Externalized?Configuration深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01