一、 Java中的異常分爲兩大類
1. Checked exception(非 Runtime exception):
2. Unchecked exception(Runtime exception):
·Java 中所有的異常類都會直接或間接地繼承自 Exception。
·RuntimeException類也是直接繼承自 Exception類,它叫做運行時異常,Java中所有的運行時異常都會直接或間接地繼承自RuntimeException。
·Java中凡是繼承自 Exception 而不是繼承自 RuntimeException 的類都是非運行時異常。
二、 異常處理的一般結構是:
try{}catch(Exception e){}finally{} 無論程序是否出現異常,finally塊中的代碼都是會被執行的。
package com.bob.exception;
public class ExceptionTest2 {
public void method() throws Exception{
System.out.println("hello world.");
throw new Exception(); //拋出異常
}
public static void main(String[] args){
ExceptionTest2 test = new ExceptionTest2();
try{
test.method(); //捕獲拋出的異常
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("welcome");
}
}
}
·對於非運行時異常(checked exception),必須要對其進行處理,處理方式有兩種:第一種是使用try...catch..finally進行捕獲;第二種是在調用該會產生異常的方法所在的方法聲明 throws Exception(相當於繼續往上拋直到main方法,如果main方法也不處理那麼就由JVM進行處理)。
·對於運行時異常(runtime exception),我們可以不對其進行處理,也可以對其進行處理。推薦不對其進行處理。
package com.bob.exception;
public class ExceptionTest3 {
public static void main(String[] args) {
String str = null;
System.out.println(str.length());
}
}
上面的程序會報NullPointerException異常。
NullPointerException 是空指針異常,出現該異常的原因在於某個引用爲null,但你卻調用了它的某個方法。這時就會出現該異常。
三、 自定義異常
所謂自定義異常,通常就是定義了一個繼承自Exception類的子類,那麼這個類就是一個自定義異常類。通話情況下,我們都會直接繼承自 Exception 類,一般不會繼承某個運行時的異常類。
package com.bob.exception;
public class MyException extends Exception {
public MyException(){
super();
}
public MyException(String message){
super(message);
}
}
package com.bob.exception;
public class MyExceptionTest {
public void method(String str) throws Exception{
if(null == str){
throw new MyException("傳入的字符串參數不能爲null");
}else{
System.out.println(str);
}
}
public static void main(String[] args) {
MyExceptionTest test = new MyExceptionTest();
try{
test.method(null);
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("異常處理完畢");
}
System.out.println("程序執行完畢");
}
}
·我們可以使用多個 catch 塊來捕獲異常,這時需要將父類型的 catch 塊放到子類型的 catch 塊之後,這樣才能保證後續的 catch 可能被執行,否則子類型的 catch 將永遠無法到達,java 編譯器會報編譯錯誤;如果多個catch塊的異常類是獨立的(MyException, MyException2),那麼誰前誰後都是可以的。
package com.bob.exception;
public class ExceptionTest5 {
public void method(){
try{
System.out.println("進入到了try");
// return ; //會先執行finally然後return
System.exit(0); //退出虛擬機。finally不執行
}
catch(Exception e){
System.out.println("異常發生了");
}
finally{
System.out.println("進入到finally塊");
}
System.out.println("異常處理後續的代碼");
}
public static void main(String[] args) {
ExceptionTest5 test = new ExceptionTest5();
test.method();
}
}
備註:1. 如果 try 塊中存在 return 語句,那麼首先也需要將 finally 塊中的代碼執行完畢,然後方法再返回。2. 如果 try 塊中存在 System.exit(0) 語句,那麼就不會執行 finally 塊中的代碼,因爲System.exit(0) 會終止當前運行的 Java 虛擬機,程序會在虛擬機終止前結束執行。