Assertion 是 Java 1.4 後才有的一個新特色,作用是幫助 debug。
例如在以下的程式中,num 的值應該要大於 0,則你可以使用 Assertion 來幫助你確認。
簡單的說,當 assert 後方的引數為 false 時,則程式就會丟出 AssertionError。
另一種用法是提供一些訊息給 Assertion,當出現 AssertionError 時,
這些訊息就會顯示在 Stack Trace 上。
例: assert(num>0):"num must greater than 0";
冒號後方的引數可為 primitive 或 Object。
Asertion 預設是不啟用,若是要啟用 Assertion 的功能,
在編譯時必須使用 "javac -source 1.4"。
(預設是 "javac -source 1.3")
目前在 6.0 版 Compile 時,已經不需要增加額外的參數了。
而在執行時則用 "java -ea" 或著 "java -enableassertions",
同樣的預設值也是不啟用。
如果只須啟用部分 class 或著部分 package 的 Assertions 功能,
可以用這樣的方式 "java -ea:com.foo.Bar",
或著只有某 package 不啟用 "java -ea -da:com.foo",
(-da 為 -disableassertions 的縮寫)
另外還有兩個參數為 "-dsa" 和 "-esa",
分別代表 "disable systema ssertion" 和 "enable systema ssertion"。
[註] Java 中的 package 並無階層的關係,
在 Assertion 未啟用的情況下,JVM 會忽略 Assertion 的處理。
Assettion 在以下的情況不建議被使用:
例如在以下的程式中,num 的值應該要大於 0,則你可以使用 Assertion 來幫助你確認。
private void methodA(int num) { assert(num>0); useNum(num+x); }
簡單的說,當 assert 後方的引數為 false 時,則程式就會丟出 AssertionError。
另一種用法是提供一些訊息給 Assertion,當出現 AssertionError 時,
這些訊息就會顯示在 Stack Trace 上。
例: assert(num>0):"num must greater than 0";
冒號後方的引數可為 primitive 或 Object。
Asertion 預設是不啟用,若是要啟用 Assertion 的功能,
在編譯時必須使用 "javac -source 1.4"。
(預設是 "javac -source 1.3")
目前在 6.0 版 Compile 時,已經不需要增加額外的參數了。
而在執行時則用 "java -ea" 或著 "java -enableassertions",
同樣的預設值也是不啟用。
如果只須啟用部分 class 或著部分 package 的 Assertions 功能,
可以用這樣的方式 "java -ea:com.foo.Bar",
或著只有某 package 不啟用 "java -ea -da:com.foo",
(-da 為 -disableassertions 的縮寫)
另外還有兩個參數為 "-dsa" 和 "-esa",
分別代表 "disable systema ssertion" 和 "enable systema ssertion"。
[註] Java 中的 package 並無階層的關係,
例如 com.foo 以及 com.foo.xxx,其中並沒有任何的關係,
它們只是在檔案系統中使用相同的目錄。
但是 Assertion 是唯一的例外,上述的 "java -ea -da:com.foo",
除了啟動 com.foo 的 Assertion 機制, com.foo 的 subpackage 也會啟動。
在 Assertion 未啟用的情況下,JVM 會忽略 Assertion 的處理。
Assettion 在以下的情況不建議被使用:
- 用來驗證 public method 的 argument。
這是因為 public method 可以被任何人呼叫, 而在 Assetion 未啟用的情況下, 即使是不正常的參數, 程式仍然會繼續執行,應該改用例外處理。
只適用於 private method 的 argument。 - 用來驗證 public method 的 argument。
原因同上。 - 用在會導致 side effect 的情況下。
程式在 assertion 的檢查過程中,不應該改變程式目前的 state。
沒有留言:
張貼留言