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