定義和特點:
java斷言assert是jdk1.4引入的。assert這個關鍵字我們稱之為“斷言”。當這個關鍵字后邊的條件為假的時候,程序自動崩潰並拋出AssertionError的異常。當這個關鍵字后面的條件為真的時候,程序繼續執行下一句語句。
意義:
什么情況下我們會需要這樣的代碼呢?當我們在測試程序的時候就很好用,因為與其讓錯誤的條件導致程序今后莫名其妙地崩潰,不如在錯誤條件出現的那一瞬間我們實現“自爆”。
作用域:
斷言assert 是僅在Debug 版本起作用的宏。
程序一般分為Debug 版本和Release 版本,Debug 版本用於內部調試,Release 版本發行給用戶使用。斷言assert 是僅在Debug 版本起作用的宏,它用於檢查“不應該”發生的情況。以下是一個內存復制程序,在運行過程中,如果assert 的參數為假,那么程序就會中止(一般地還會出現提示對話,說明在什么地方引發了assert)。
assert只有在Debug版本中才有效,如果編譯為Release版本則被忽略。
JVM運行參數配置:
jvm斷言默認是關閉的。斷言可以局部開啟的,如:父類禁止斷言,而子類開啟斷言,所以一般說“斷言不具有繼承性”。
-ea java -ea 打開所有用戶類的assertion -da java -da 關閉所有用戶類的assertion -ea:<classname> java -ea:MyClass1 打開MyClass1的assertion -da:<classname> java -da: MyClass1 關閉MyClass1的assertion -ea:<packagename> java -ea:pkg1 打開pkg1包的assertion -da:<packagename> java -da:pkg1 關閉pkg1包的assertion -ea:... java -ea:... 打開缺省包(無名包)的assertion -da:... java -da:... 關閉缺省包(無名包)的assertion -ea:<packagename>... java -ea:pkg1... 打開pkg1包和其子包的assertion -da:<packagename>... java -da:pkg1... 關閉pkg1包和其子包的assertion -esa java -esa 打開系統類的assertion -dsa java -dsa 關閉系統類的assertion 綜合使用 java -dsa:MyClass1:pkg1 關閉MyClass1和pkg1包的assertion
判斷是否開啟斷言:
1 public static void main(String args[]) { 2 boolean isOpen = false; 3 // 如果開啟了斷言,會將isOpen的值改為true。 4 assert isOpen = true; 5 // 打印是否開啟了斷言。如果為false,則沒有啟用斷言;如果為true,表示已開啟斷言。 6 System.out.println(isOpen); 7 }
使用斷言例子:
1 package com.jklopp.test.iassert; 2 3 4 import java.io.File;import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8 9 public class MyAssert{ 10 public static void main(String[] args) { 11 readFile("E:\\test\\time2.jpeg"); 12 System.out.println("程序執行完畢"); 13 } 14 15 16 /** 17 * 讀取文件 18 * @param readFile 要讀取的文件 19 */ 20 public static void readFile(String readFile) { 21 InputStream in = null; 22 try { 23 File file = new File(readFile); 24 in = new FileInputStream(file); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } finally { 28 try { 29 assert in != null; // 如果in為null,直接退出jvm結束程序。 30 in.close(); 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } 34 } 35 } 36 }
