改善Java程序建議19

建議19 : 斷言不是雞肋

基本用法:
assert <布爾表達式>
assert <布爾表達式> : <錯誤信息>
在布爾表達式為假時,拋出AssertionError錯誤。

  1. assert默認是不啟用的。
    斷言的目的是為了能夠快速、方便的檢查到程序異常,使用用assert關鍵字。
  2. assert拋出的異常AssertError是繼承自Error的。
    斷言失敗后,JVM拋出的錯誤是嚴重的,必須處理。

不可使用的情況:

  1. 對外公開的方法。即public方法。例子:
public class Client {
    public static void main(String[] args) {
           StringUtils.encode(null);
    }
}
//字符串處理工具類
class StringUtils{
    public static String encode(String str){
            assert str!=null:"加密的字符串為null";            /*加密處理*/
    }
}

調(diào)用者合理調(diào)用卻報錯。
2.在執(zhí)行邏輯代碼的情況下。
assert在開發(fā)時可以運行,在生產(chǎn)系統(tǒng)中則不需要其運行,所以用assert去處理邏輯永遠都不會執(zhí)行。如下:

public void doSomething (List list, Object element){
  assert list.remove(element):"刪除元素" + element + "失敗"
}

下面三種情況可以使用:
(1)在私有方法中放置assert作為輸入?yún)?shù)的校驗
在私有方法中可以放置assert校驗輸入?yún)?shù),因為私有方法的使用者是作者自己,私有方法的調(diào)用者和被調(diào)用者之間是一種弱契約關系,或者說沒有契約關系,其間的約束是依靠作者自己控制的,因此加上assert可以更好地預防自己犯錯,或者無意的程序犯錯。
(2)流程控制中不可能達到的區(qū)域
這類似于JUnit的fail方法,其標志性的意義就是:程序執(zhí)行到這里就是錯誤的,例如:

public void doSomething(){
    int i = 7;
    while(i >7){
            /*業(yè)務處理*/
    }
    assert false:"到達這里就表示錯誤";
}

(3)建立程序探針
我們可能會在一段程序中定義兩個變量,分別代表兩個不同的業(yè)務含義,但是兩者有固定的關系,例如var1=var2*2,那我們就可以在程序中到處設“樁”,斷言這兩者的關系,如果不滿足即表明程序已經(jīng)出現(xiàn)了異常,業(yè)務也就沒有必要運行下去了

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,649評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,741評論 18 399
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用。 當JAVA程序違反了JA...
    八爺君閱讀 5,234評論 1 114
  • 一. Java基礎部分.................................................
    wy_sure閱讀 4,017評論 0 11
  • 小家伙幼兒園的第一個學期即將結束,我卻是第一次去接他。 當我走到課室門口的時候,坐在凳子上玩玩具的小家伙一看到我,...
    向著太陽奔跑的石頭閱讀 250評論 0 0

友情鏈接更多精彩內(nèi)容