最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java之a(chǎn)ssert關(guān)鍵字用法案例詳解

 更新時間:2021年08月31日 15:57:12   作者:楊家昌  
這篇文章主要介紹了java之a(chǎn)ssert關(guān)鍵字用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

Java2在1.4中新增了一個關(guān)鍵字:assert。在程序開發(fā)過程中使用它創(chuàng)建一個斷言(assertion)。,它的語法形式有如下所示的兩種形式:

1、assert condition;
這里condition是一個必須為真(true)的表達(dá)式。如果表達(dá)式的結(jié)果為true,那么斷言為真,并且無任何行動
如果表達(dá)式為false,則斷言失敗,則會拋出一個AssertionError對象。這個AssertionError繼承于Error對象,
而Error繼承于Throwable,Error是和Exception并列的一個錯誤對象,通常用于表達(dá)系統(tǒng)級運行錯誤。

2、asser condition:expr;
這里condition是和上面一樣的,這個冒號后跟的是一個表達(dá)式,通常用于斷言失敗后的提示信息,說白了,它是一個傳到AssertionError構(gòu)造函數(shù)的值,如果斷言失敗,該值被轉(zhuǎn)化為它對應(yīng)的字符串,并顯示出來。

用一個例子說明一下:

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");
    }
}

這里有一個測試類,通過之前簡單的語法介紹后,可以這樣簡單的理解這個例子:

當(dāng)程序運行到assert true這一句時,condition為true,系統(tǒng)會繼續(xù)執(zhí)行下去。而后執(zhí)行到 assert false:"stop"的時候,由于condition=false,系統(tǒng)會拋出AssertionError。

但是試試上是不是這樣的呢?

看看運行結(jié)果就知道了

start
go on
end

這個運行結(jié)果和我們一開始的預(yù)期不一致,問題出在哪里了?

原來java的斷言與C語言中的斷言還有有些不同的地方。

Java的assertion的開啟也和C語言不太一樣,在C語言中,assertion的開啟是在編譯時候決定的。當(dāng)我們使用debug方式編譯程序時候,assertion被開啟,而使用release方式編譯時候,assertion自動被關(guān)閉。  而Java的assertion卻是在運行的時候進(jìn)行決定的。其實,這兩種方式是各有優(yōu)缺點。如果采用編譯時決定方式,開發(fā)人員將處理兩種類型的目標(biāo)碼,debug版本和release版本,這加大了文檔管理的難度,但是提高了代碼的運行效率。  Java采用運行時決定的方式,這樣所有的assertion信息將置于目標(biāo)代碼 中,同一目標(biāo)代碼可以選擇不同方式運行,增強(qiáng)目標(biāo)代碼的靈活性,但是它將犧牲因為assertion而引起一部分性能損失。    

說直白一點就是:assert關(guān)鍵字需要在運行時候顯式開啟才能生效,否則你的斷言就沒有任何意義。

如果需要觀察斷言的運行情況,就需要打開系統(tǒng)類的assertion功能 ,我們可使用-esa參數(shù)打開,使用 -dsa參數(shù)關(guān)閉。  -esa和-dsa的全名為-enablesystemassertions和 -disenablesystemassertions,全名和縮寫名有同樣的功能。

我們還是用剛剛那個測試方法,再執(zhí)行試試看:

當(dāng)我們只是通過java命令編譯、執(zhí)行測試方法時,并沒有執(zhí)行assert語句;然而通過java -ea Test命令顯示打開assertion功能后,發(fā)現(xiàn)系統(tǒng)確實執(zhí)行了assert語句。

另外,我們注意到體統(tǒng)拋出的是AssertionError,作為Error的一個子類,而不是 RuntimeException。Error代表一些異常的錯誤,通常是不可以恢復(fù)的,而 RuntimeException強(qiáng)調(diào)該錯誤在運行時才發(fā)生的特點。AssertionError通常為非常關(guān)鍵的錯誤,這些錯誤往往是不容易恢復(fù)的,而且assertion機(jī)制也不鼓勵程序員對這種錯誤進(jìn)行恢復(fù)。

通過這個實驗的現(xiàn)象,可以引發(fā)一些思考:

1.assert需要顯示的開啟生效才有作用。

這就意味著你如果使用IDE工具編碼,調(diào)試運行時候會有一定的麻煩,因為基本上java IDE都是沒有開啟斷言功能的。并且,對于Java Web應(yīng)用,程序代碼都是部署在容器里面,你沒法直接去控制程序的運行,如果一定要開啟-ea的開關(guān),則需要更改Web容器的運行配置參數(shù)。這對程序的移植和部署都帶來很大的不便。

2.assert斷言失敗將面臨程序的退出。這在一個生產(chǎn)環(huán)境下的應(yīng)用是絕不能容忍的。一般都是通過異常處理來解決程序中潛在的錯誤。但是使用斷言就很危險,一旦失敗系統(tǒng)就掛了。

3.即使處理了Error,如果斷言的代碼嵌入到業(yè)務(wù)流程中,一旦assert失效,也就改變了正常的業(yè)務(wù)邏輯(如果condition中加入了賦值等操作)。

我想可能就是這些原因?qū)е缕綍r的java開發(fā)中幾乎不會用到assert關(guān)鍵字,即便如此,JDK中還是存在不少使用assert的地方,比方說java.util.Locale類等

4.是不是可用通過封裝一些方法,自己來完成斷言的功能,既使用簡單,又方便理解。至少我是這樣做的。

到此這篇關(guān)于java之a(chǎn)ssert關(guān)鍵字用法案例詳解的文章就介紹到這了,更多相關(guān)java之a(chǎn)ssert關(guān)鍵字用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)發(fā)送郵件功能

    java實現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • SpringBoot實現(xiàn)圖片上傳及本地訪問

    SpringBoot實現(xiàn)圖片上傳及本地訪問

    在SpringBoot項目中,處理靜態(tài)文件訪問尤其是實時更新的文件如商品圖片,可通過配置WebMvcConfig將本地文件映射到URL路徑上,以解決重啟項目才能訪問文件的問題,本文詳解如何保存和訪問這些文件,幫助開發(fā)者優(yōu)化項目文件管理
    2022-09-09
  • java異常處理詳細(xì)介紹及實例

    java異常處理詳細(xì)介紹及實例

    這篇文章主要介紹了java異常處理詳細(xì)介紹及實例的相關(guān)資料,本文對java異常進(jìn)行了知識層次的總結(jié),需要的朋友可以參考下
    2017-04-04
  • SpringBoot中實現(xiàn)定時任務(wù)的4種方式詳解

    SpringBoot中實現(xiàn)定時任務(wù)的4種方式詳解

    這篇文章主要介紹了SpringBoot中實現(xiàn)定時任務(wù)的4種方式詳解,在Springboot中定時任務(wù)是一項經(jīng)常能用到的功能,實現(xiàn)定時任務(wù)的方式有很多,今天來介紹常用的幾種,需要的朋友可以參考下
    2023-11-11
  • Java編程實現(xiàn)軌跡壓縮之Douglas-Peucker算法詳細(xì)代碼

    Java編程實現(xiàn)軌跡壓縮之Douglas-Peucker算法詳細(xì)代碼

    這篇文章主要介紹了Java編程實現(xiàn)軌跡壓縮之Douglas-Peucker算法詳細(xì)代碼,具有一定借鑒價值,需要的朋友可以參考。
    2017-11-11
  • Selenium Webdriver實現(xiàn)截圖功能的示例

    Selenium Webdriver實現(xiàn)截圖功能的示例

    今天小編就為大家分享一篇Selenium Webdriver實現(xiàn)截圖功能的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 一文詳解Java攔截器與過濾器的使用

    一文詳解Java攔截器與過濾器的使用

    這篇文章主要為大家詳細(xì)介紹了Java中攔截器與過濾器的使用與區(qū)別,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定參考價值,需要的可以參考一下
    2022-04-04
  • MyBatis使用Map與模糊查詢的方法示例

    MyBatis使用Map與模糊查詢的方法示例

    這篇文章主要給大家介紹了關(guān)于MyBatis使用Map與模糊查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 解決dubbo啟動報服務(wù)注冊失敗Failed?to?register?dubbo

    解決dubbo啟動報服務(wù)注冊失敗Failed?to?register?dubbo

    這篇文章主要介紹了解決dubbo啟動報服務(wù)注冊失敗Failed?to?register?dubbo問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java計算Date類時間差實例代碼演示

    Java計算Date類時間差實例代碼演示

    最近工作中遇到需要計算時間差,這里給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Java計算Date類時間差的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評論

清水县| 和田市| 天长市| 讷河市| 惠安县| 石城县| 鹿邑县| 巩义市| 锡林浩特市| 乳山市| 宁安市| 巍山| 神木县| 广汉市| 崇明县| 尖扎县| 长沙市| 东丰县| 双桥区| 阿城市| 铜梁县| 霍州市| 苍梧县| 大同市| 仙游县| 张掖市| 贺兰县| 马鞍山市| 惠州市| 乌什县| 肥城市| 临高县| 广平县| 南康市| 古田县| 普定县| 库车县| 习水县| 镇雄县| 科技| 清徐县|