1、異常體系:
圖片來源:https://blog.csdn.net/zhanaolu4821/article/details/81012382
Trowable有兩個子類:Error和Exception:
Error:
是與虛擬機有關的異常,如:系統崩潰,動態鏈接失敗,虛擬機錯誤(AWTError、IOError),是不能捕獲;
Jvm的內存消耗完會報的OutOfMemoryError,這種錯誤發生後,JVM就會停止線程;
Exception
包含RuntimeException和checkException異常
RuntimeException是運行時異常,主要原因是程序員沒有正確的編寫代碼導致的異常,需要程序員修改代碼,而不是對其進行捕獲,
常見的RuntimeException有:IndexOfBoundlesException、ArthmaticException、NullException、NumberFormateException、classCastException
checkException異常是非RuntimeException就是checkedException,在代碼編寫階段強制編程人員處理的異常,如FilenotFoundException
處理方式有兩種: try catch 在方法聲明中throws 拋出
2、try catch finally的執行順序
情況1: try{} catch(){}finally{} return;
public class TryTest {
public static void main(String[] args) {
String result = trytestFunction();
System.out.println(result);
}
private static String trytestFunction() {
try {
System.out.println("執行try方法!");
} catch (Exception e) {
System.out.println("執行catch方法!");
}finally {
System.out.println("執行finally方法!");
}
return "44444";
}
}
執行try方法!
執行finally方法!
44444
情況2: try{ return; }catch(){} finally{} return;
public class TryTest {
public static void main(String[] args) {
String result = trytestFunction();
System.out.println(result);
}
/**
先執行try塊中return 語句(包括return語句中的表達式運算),但不返回;
執行finally語句中全部代碼
最後執行try中return 返回
*
*/
private static String trytestFunction() {
try {
System.out.println("執行try方法!");
return "try";
} catch (Exception e) {
System.out.println("執行catch方法!");
}finally {
System.out.println("執行finally方法!");
}
return "44444";
}
}
執行try方法!
執行finally方法!
try
3、 try{ } catch(){return;} finally{} return;
public class TryTest {
public static void main(String[] args) {
String result = trytestFunction();
System.out.println(result);
}
/**
有異常:
執行catch中return語句,但不返回
執行finally語句中全部代碼,
最後執行catch塊中return返回。 finally塊後的return語句不再執行
* 無異常:
* 正常順序執行
*/
private static String trytestFunction() {
try {
throw new Exception("有異常!");
/* System.out.println("執行try方法!"); */
} catch (Exception e) {
System.out.println("執行catch方法!");
return "catch";
}finally {
System.out.println("執行finally方法!");
}
}
}
執行catch方法!
執行finally方法!
catch
4、情況4: try{ return; }catch(){} finally{return;}
public class TryTest {
public static void main(String[] args) {
String result = trytestFunction();
System.out.println(result);
}
/**
執行try塊return語句(包括return語句中的表達式運算),但不返回;
再執行finally塊,
執行finally塊,有return,從這裏返回。
*
*/
private static String trytestFunction() {
try {
System.out.println("執行try方法!");
return "try";
} catch (Exception e) {
System.out.println("執行catch方法!");
return "catch";
}finally {
System.out.println("執行finally方法!");
return "finally";
}
}
}
執行try方法!
執行finally方法!
finally
5、try{} catch(){return;}finally{return;}
public class TryTest {
public static void main(String[] args) {
String result = trytestFunction();
System.out.println(result);
}
/**
程序執行catch塊中return語句(包括return語句中的表達式運算),但不返回;
再執行finally塊,
執行finally塊,有return,從這裏返回。
*
*/
private static String trytestFunction() {
try {
System.out.println("執行try方法!");
throw new Exception("遇到錯誤!");
} catch (Exception e) {
System.out.println("執行catch方法!");
return "catch";
}finally {
System.out.println("執行finally方法!");
return "finally";
}
}
}
執行try方法!
執行catch方法!
執行finally方法!
finally
6、try{ return;}catch(){return;} finally{return;}
public class TryTest {
public static void main(String[] args) {
String result = trytestFunction();
System.out.println(result);
}
/**
有異常:
執行catch塊中return語句(包括return語句中的表達式運算),但不返回;
再執行finally塊
執行finally塊,有return,從這裏返回。
無異常:
先執行try塊
再執行finally塊
執行finally塊,有return,從這裏返回。。
*
*/
private static String trytestFunction() {
try {
System.out.println("執行try方法!");
return "try";
} catch (Exception e) {
System.out.println("執行catch方法!");
return "catch";
}finally {
System.out.println("執行finally方法!");
return "finally";
}
}
}
執行try方法!
執行finally方法!
finally
總結:
1、任何執行try 或者catch中的return語句之後,在返回之前,如果finally存在的話,都會先執行finally語句;
2、如果finally中有return語句,那麼程序就return了,所以finally中的return是一定會被return的;
3、常見的幾種Exception
(此部分引用自https://blog.csdn.net/zhanaolu4821/article/details/81012382)
java.lang.IllegalAccessError:違法訪問錯誤。當一個應用試圖訪問、修改某個類的域(Field)或者調用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。
java.lang.InstantiationError:實例化錯誤。當一個應用試圖通過Java的new操作符構造一個抽象類或者接口時拋出該異常.
java.lang.OutOfMemoryError:內存不足錯誤。當可用內存不足以讓Java虛擬機分配給一個對象時拋出該錯誤。
java.lang.StackOverflowError:堆棧溢出錯誤。當一個應用遞歸調用的層次太深而導致堆棧溢出或者陷入死循環時拋出該錯誤。
java.lang.ClassCastException:類造型異常。假設有類A和B(A不是B的父類或子類),O是A的實例,那麼當強制將O構造爲類B的實例時拋出該異常。該異常經常被稱爲強制類型轉換異常。
java.lang.ClassNotFoundException:找不到類異常。當應用試圖根據字符串形式的類名構造類,而在遍歷CLASSPAH之後找不到對應名稱的class文件時,拋出該異常。
java.lang.ArithmeticException:算術條件異常。譬如:整數除零等。
java.lang.ArrayIndexOutOfBoundsException:數組索引越界異常。當對數組的索引值爲負數或大於等於數組大小時拋出。
java.lang.IndexOutOfBoundsException:索引越界異常。當訪問某個序列的索引值小於0或大於等於序列大小時,拋出該異常。
java.lang.InstantiationException:實例化異常。當試圖通過newInstance()方法創建某個類的實例,而該類是一個抽象類或接口時,拋出該異常。
java.lang.NoSuchFieldException:屬性不存在異常。當訪問某個類的不存在的屬性時拋出該異常。
java.lang.NoSuchMethodException:方法不存在異常。當訪問某個類的不存在的方法時拋出該異常。
java.lang.NullPointerException:空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等。
java.lang.NumberFormatException:數字格式異常。當試圖將一個String轉換爲指定的數字類型,而該字符串確不滿足數字類型要求的格式時,拋出該異常。
java.lang.StringIndexOutOfBoundsException:字符串索引越界異常。當使用索引值訪問某個字符串中的字符,而該索引值小於0或大於等於序列大小時,拋出該異常。