一、概述
在C和C++語言中都有assert關鍵,表示斷言。
在Java中,同樣也有assert關鍵字,表示斷言,用法和意義都差不多。
二、語法
在Java中,assert關鍵字是從JAVA SE 1.4 引入的,為了避免和舊版本的Java代碼中使用了assert關鍵字導致錯誤,Java在執行的時候默認是不啟動檢查斷言的(這個時候,所有的斷言語句都將忽略!),如果要開啟斷言檢查,則需要用開關-enableassertions或-ea來開啟。
assert關鍵字語法很簡單,有兩種用法:
1、assert
如果
如果為false,則程式拋出AssertionError,並終止執行。
2、assert
如果
如果為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的思考
assert既然是為了調試測試程序用,不在正式生產環境下用,那應該考慮更好的測試JUint來代替其做用,JUint相對assert關鍵的所提供的功能是有過之而無不及。當然完全可以透過IDE debug來進行調試測試。在此看來,assert的前途一片昏暗。
因此,應避免在Java中使用assert關鍵字,除非哪一天Java預設支援開啟-ea的開關,這時候可以考慮。對比一下,assert能為你帶來多少好處,多少麻煩,這是我們選擇是否使用的原則。
================================================ ============
comment:
反過來說,在某些開源元件中,例如validator、junit中,判斷過程彷彿使用了斷言風格,很有可能使用了大量的斷言,但筆者在沒看源碼之前不能確定。
如果是開發階段的簡單測試,junit就是一個便捷強悍的工具,沒有理由自己寫斷言而不去用它。
================================================ ============
comment:
首先可以用在單元測試程式碼中。 junit侵入性是很強的,如果整個工程大量的程式碼都使用了junit,就難以去掉或是選擇另一個框架。如果單元測試程式碼 很多,並且想重複使用這些單元測試案例,應該選擇assert而不是junit,以便使用別的單元測試框架,例如TestNG。同理正式的功能代碼根本就不應 該出現Junit,應該使用assert.
assert主要適合在基類,框架類,接口類,核心代碼類,工具類中。換言之,當你的程式碼的呼叫者是另一個程式設計師寫得業務代碼,或是另外一個子系統時,就很有必要使用它。例如你做了一個快速排序的演算法
public static List<int> quickSort(List<int> list){ assert list != null; // 申请临时空间 //开始排序 for(int i : list){ // } }
這種情況下,如果不檢查傳入參數的正確性,會拋出一個莫名其妙的空指標錯誤。你的呼叫者可能不清楚你程式碼的細節,在一個系統的深處調試一個空指標錯誤是很浪費時間的。就應該直接明確的告訴你的呼叫者是傳入的參數有問題。否則他會懷疑你的程式碼有BUG。使用assert可以避免兩個程式設計師之間互相指責對方寫的程式碼有問題。
assert適用那些你知道具體是什麼錯誤,你和你的呼叫者已經約定應該由你的呼叫者去排除或檢查的錯誤。你透過一個斷言告訴你的呼叫者。 assert不適用那些外部系統造成的錯誤,例如使用者輸入資料的錯誤,某個外部檔案格式錯誤。這些錯誤不是你的呼叫者而是使用者造成的,甚至不屬於異常,因為出現輸入錯誤和檔案格式錯誤是經常的,這些錯誤應該由業務代碼去檢查。
assert比較適合被頻繁調用的 基類,框架代碼,工具類,核心代碼,接口代碼中,這正是它在運行時被去掉的原因。測試程式碼應該在測試階段開啟-ea參數,以便對系統深處的核心程式碼做仔細的測試。
Java較少使用assert的原因是Java有很完整的OO體系,強制類型轉換出現得較少,所以不需要類似c那樣需要頻繁的檢查指針的類型是否正確,指針是否為空。同時Java也很少直接管理記憶體或緩衝區,所以不需要頻繁的檢查傳入的緩衝區是否為空或已經越界。
但使用好assert有助於提高框架程式碼的正確性和減少框架程式碼的使用者的偵錯時間。
================================================ ===============
comment:
assert要達到的目的是讓程式設計師方便的發現自己的邏輯錯誤,並且不影響程式的效率。 assert所發現的錯誤,是完全不該出現的,是不能用異常取代的。異常,那是系統所允許的,或者是系統不可控的“錯誤”,它不是程式設計師的邏輯問題。
assert應該是開發階段打開,而在發布後關閉。
更多Java陷阱之assert關鍵字詳解相關文章請關注PHP中文網!

Java在企業級應用中被廣泛使用是因為其平台獨立性。 1)平台獨立性通過Java虛擬機(JVM)實現,使代碼可在任何支持Java的平台上運行。 2)它簡化了跨平台部署和開發流程,提供了更大的靈活性和擴展性。 3)然而,需注意性能差異和第三方庫兼容性,並採用最佳實踐如使用純Java代碼和跨平台測試。

JavaplaysigantroleiniotduetoitsplatFormentence.1)itallowscodeTobewrittenOnCeandrunonVariousDevices.2)Java'secosystemprovidesuseusefidesusefidesulylibrariesforiot.3)

ThesolutiontohandlefilepathsacrossWindowsandLinuxinJavaistousePaths.get()fromthejava.nio.filepackage.1)UsePaths.get()withSystem.getProperty("user.dir")andtherelativepathtoconstructthefilepath.2)ConverttheresultingPathobjecttoaFileobjectifne

Java'splatFormIndenceistificantBecapeitAllowSitallowsDevelostWriTecoDeonCeandRunitonAnyPlatFormwithAjvm.this“ writeonce,runanywhere”(era)櫥櫃櫥櫃:1)交叉plat formcomplibility cross-platformcombiblesible,enablingDeploymentMentMentMentMentAcrAptAprospOspOspOssCrossDifferentoSswithOssuse; 2)

Java適合開發跨服務器web應用。 1)Java的“一次編寫,到處運行”哲學使其代碼可在任何支持JVM的平台上運行。 2)Java擁有豐富的生態系統,包括Spring和Hibernate等工具,簡化開發過程。 3)Java在性能和安全性方面表現出色,提供高效的內存管理和強大的安全保障。

JVM通過字節碼解釋、平台無關的API和動態類加載實現Java的WORA特性:1.字節碼被解釋為機器碼,確保跨平台運行;2.標準API抽像操作系統差異;3.類在運行時動態加載,保證一致性。

Java的最新版本通過JVM優化、標準庫改進和第三方庫支持有效解決平台特定問題。 1)JVM優化,如Java11的ZGC提升了垃圾回收性能。 2)標準庫改進,如Java9的模塊系統減少平台相關問題。 3)第三方庫提供平台優化版本,如OpenCV。

JVM的字節碼驗證過程包括四個關鍵步驟:1)檢查類文件格式是否符合規範,2)驗證字節碼指令的有效性和正確性,3)進行數據流分析確保類型安全,4)平衡驗證的徹底性與性能。通過這些步驟,JVM確保只有安全、正確的字節碼被執行,從而保護程序的完整性和安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Dreamweaver CS6
視覺化網頁開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。