java的異常機(jī)制,可能會(huì)出現(xiàn)意想不到的問題
這里新人,就來(lái)簡(jiǎn)單說(shuō)說(shuō)自己對(duì)異常的看法吧。
java的異常機(jī)制是一把雙刃劍;如果用得好可以做大事情,用不好就會(huì)出現(xiàn)意想不到的問題。
1.throw的用法
throw是拋出異常所用,不過下面的例子是不能這樣throw的:
throw new IOException();
異常鏈的機(jī)制需要保留,且不能隨便拋出空的異常信息。
還有,基本上要避免拋出基于空指針異常的基類異常(RuntimeException、Exception、Throwable)
因?yàn)榭罩羔槷惓_@樣的運(yùn)行時(shí)異常極有可能發(fā)生在任何地方,如果直接拋出的話會(huì)讓調(diào)用者難以發(fā)現(xiàn)或者需要捕捉意外的異常從而導(dǎo)致更多的資源占用。
而且大量的非空判斷也會(huì)使代碼的效率和可讀性下降。
所以,如果想要用異常機(jī)制處理問題且不只是日志記錄的話就拋出相對(duì)具體的非運(yùn)行時(shí)異常吧,而其他的時(shí)候就拋出具體的運(yùn)行時(shí)異常(而且不能是NullPointerException,否則很難打出異常鏈)
2.try-catch的用法
try-catch的部分盡量要控制好,這個(gè)也不容易
首先,try-catch部分如果捕獲可檢查性異常要從里到外是具體異常到基類異常或者是并列的級(jí)別同樣大小的異常的關(guān)系
最好不要只出現(xiàn)try-catch(Exception e)或者try-catch(Throwable t)之類的或者出現(xiàn)try-catch基于空指針異常的基類或者try-catch空指針異常,否則會(huì)把意外的運(yùn)行時(shí)異常也捕獲導(dǎo)致出現(xiàn)潛在的問題
如果想catch(Exception)或者throwable的話一般catch塊只能寫日志記錄信息和返回值信息,而且這樣的話最好要用finally來(lái)釋放資源(流的關(guān)閉、鎖的解鎖、數(shù)據(jù)刷新、容器的清空等都可以在這里操作),避免資源浪費(fèi)和出現(xiàn)更大的問題。當(dāng)然,finally一定是寫這種而不能出現(xiàn)中斷類型的操作!
還有,除了圖片刷新之類,其他情況最好不要直接返回null,否則就可能發(fā)生空指針異常。
對(duì)了,能少用異常就少用異常,既能減少性能消耗還可以使代碼變得更容易看明白,差錯(cuò)也方便。而且盡可能少地出現(xiàn)大量代碼出現(xiàn)在try塊中的情況。