Java基础(七)--Exception异常处理
發現錯誤的理想時機是程序運行之前(編譯期),然后不太現實,很多異常無法被發現(特別是業務上的數據),需要在運行時解決。
錯誤恢復機制保證代碼健壯性的方式,異常處理在程序中很常見,也是必須的,必須考慮有可能發生的異常,才能保證程序的正常運行。而且
一旦程序出現異常,異常處理及日志能幫助我們定位和解決異常。
概念:
Exception,是一種意外,不正常的現象。使用異常可以降低處理代碼的復雜度,如果不適用異常,就必須通過判斷去檢查錯誤,而且可能在很
多地方都要判斷,使用異常,只需要在一個地方處理錯誤,可以節省代碼,能夠把正常程序運行和異常分開。
異常分為Error和Exception,繼承Throwable
1、Error:無法處理的異常,是一種錯誤,最常見的就是OutOfMemoryError,jvm直接停止運行
2、Exception:一般性的異常,只要能夠捕捉處理,就能保證程序正常運行,比如NullPointerException、IndexOutOfBoundsException
Exception又分為:
1、運行時異常RuntimeException:
我們將RuntimeException或其他繼承自RuntimeException的子類稱為unchecked Exception。RuntimeException即使不編寫異常處理的程序
代碼,依然可以編譯成功。這種異常在程序運行過程中可能出現,例如NullPointException、ClassCastException等
2、非運行時異常RuntimeException:
其他繼承自Exception異常的子類稱為checked Exception,編譯器強制要求進行捕獲處理,比如常見的IOExeption、SQLException,否則編
譯無法通過
如何處理異常?
異常處理方式常用的有兩種,分別如下:
1、try、catch、finally
public static void main(String[] args) {try { //要檢查的程序語句int i = 3/0;System.out.println("test");}} catch (ArithmeticException e) {System.out.println("ArithmeticException");} catch (Exception e) { //異常發生時的處理語句System.out.println("Exception Message: " + e.getMessage());throw e;} finally { //肯定會執行的部分,無論是否發生異常System.out.println("finally Handler");}
} 結果:
ArithmeticException
finally Handler 總結:
1、finally、catch都是可以省略的
2、catch可以有多個,如果沒有異常,不會執行,發生異常的話,按照順序匹配,如果匹配,就不會與后面的catch塊匹配
3、finally無論如何都會執行,即使之前有return語句。通常在finally進行資源釋放的代碼,或者lock的解鎖,某些業務場景等
PS:不要在finally使用return,因為會覆蓋之前的return語句,很容易造成混淆
相比throws更加靈活,更好的控制程序流程
2、throw、throws
public int add(int i) throws Exception {if (i == 0) {throw new IllegalArgumentException();}return 0;
} throws:是把異常交給jvm進行處理,把異常往上層拋出,一旦發生最終的結果可能就會程序終止(如果上層方法不進行try catch),可以拋出
多個異常,一般需要在上層進行try catch塊進行處理。
throw:用于主動拋出異常,throw關鍵字可以寫在任何地方,通常和業務有關,通常這個異常時自定義和業務相關的Exception類
總結和建議:
1、父類或接口,對于子類是實現類的限制:
1.1).無論是繼承還是實現,父類或者接口沒有拋出異常,實現類或子類不能拋出異常
public class A {public void f1() {}
}
public class B extends A{@Overridepublic void f1() throws IOException{System.out.println("");}
} 1.2).父類或者接口拋出異常Exception1,實現類或子類可以是否拋出異常都可以,如果拋出Exception2,不能是Exception1的父類
public class A {public void f1() throws IOException{}
}
public class B extends A{@Overridepublic void f1() throws Exception{System.out.println("");}
} 1.3).父類的方法拋出異常只有非運行時異常(運行時異常),則子類在重寫該方法的時候聲明的異常也只能有非運行時異常(運行時異常),
不能含有運行時異常(非運行時異常)。
public class A {public void f1() throws IOException{}
}
public class B extends A{@Overridepublic void f1() throws IOException,ClassNotFoundException{System.out.println("");}
} PS:類和接口在這方面的限制是相同的
2、throws一定是具體的Exception,而不是直接拋出Exception,否則上層必須也是拋出Exception,無法定位具體的異常
3、多catch塊的異常,一定是小異常在前面,否則可能永遠無法捕捉到
4、謹慎使用異常,因為會影響程序性能,能用判斷解決還是要判斷的
5、不要使用空的catch塊
6、異常處理盡量拋到最上層進行統一處理
內容參考:Java異常處理和設計和《Java異常處理》
轉載于:https://www.cnblogs.com/huigelaile/p/11015151.html
總結
以上是生活随笔為你收集整理的Java基础(七)--Exception异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring 组件基于注解的注册方式
- 下一篇: 第2节 mapreduce深入学习:4,