異常,finally&&return

異常

Throwable下有兩種,一種是Error錯誤類,另一種是Exception異常類。

異常exception又分爲運行時異常和非運行時異常

常見的4中運行時異常

  1. ClassCastException(類轉換異常)

  2. IndexOutOfBoundsException(數組越界)

  3. NullPointerException(空指針)

  4. ArithmeticExceptio(除數爲0)

運行時異常是在運行中出現的,在編譯時是不會報錯的,當你throw一個運行時異常時,不在方法外添加throws編譯器也不會發生報錯。

Throw:手動拋出異常

Throws:用在方法後面聲明可能會拋出的異常

異常處理機制-try-catch-finally

如果異常出現,程序沒有將其處理,那麼程序就會中斷,於是用異常處理機制-try-catch-finally。

try{

​ //可能發生異常的代碼

}catch(){

​ //處理異常的代碼

}finally{

​ //無論是否發生異常都會執行的代碼,常用於程序資源的回收處理

}

-try-catch-finally中可以有多個catch也可以沒有catch,但try必須和catch或者finally搭配使用。

dasda

  • 不要把所有的代碼都寫到try裏面,try裏面的代碼執行時,系統維護堆棧跟蹤信息,執行效率低

  • catch是捕捉異常的,順序執行,所有不要把父類異常放在子類異常的上面,否則報錯。如果catch裏沒有捕捉到當前的異常,那麼程序還是會中斷

  • finally裏的代碼,不管異常是否捕捉都一定會執行。例io流中的close()方法一般都放到finally裏進行,finally於return也是個坑點。

finally&&return

直接上代碼,下列輸出結果是多少?
static int i=0;
public static int test(){
try {
System.out.println("try  "+i);
return i;
}finally{
++i;
System.out.println("finally  "+i);
}
}
public static void main(String[] args) {
System.out.println(test());
System.out.println(i);
System.out.println("-----------------");
}
結果:
try  0
finally  1
0
1
-----------------
程序運行到try中時,此時的i=0,有個return,應該結束方法,但是finally中的代碼一定會執行,所以 i 在return的緩衝區中,繼續執行finally中的代碼,使得i=1,整個方法結束後返回的還是try中return的 i 的值:0 , i 的值自增爲1。


在finally中也加了一個return呢
static int i=0;
public static int test(){
try {
System.out.println("try  "+i);
return i;
}finally{
++i;
System.out.println("finally  "+i);
return i;
}
}
public static void main(String[] args) {
System.out.println(test());
System.out.println(i);
System.out.println("-----------------");
}
結果:
try  0
finally  1
1
1
-----------------

finally的return最後執行,會覆蓋掉try裏面的return,所以這裏方法的返回值爲1。


接着看如下代碼
public static int test02() {
int c = 0;
try {
c = 5 / 0;
System.out.println(5 / 0);
return 0;
} catch (NullPointerException e) {
System.out.println("空指針異常");
} finally {
System.out.println("finally");
}
return c;
}
public static void main(String[] args) {
System.out.println(test02());
System.out.println("test02 over");
}
結果:
finally
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.z.exception.Return1.test02(Return1.java:19)
at com.z.exception.Return1.main(Return1.java:35)
程序最後的"test02 over"沒有輸出,出錯,因爲catch中沒有捕捉到異常,程序中斷。


那麼下面呢?
public static int test01() {
try {
System.out.println(5 / 0);
return 0;
} catch (NullPointerException e) {


} finally {
System.out.println("finally");
return 0;
}
}
public static void main(String[] args) {
System.out.println(test01());
System.out.println("test01 over");
System.out.println("---------------------");
}
結果:
finally
0
test01 over
---------------------

try中是有異常的:除數爲0,而且catch中捕捉的是空指針異常,所以異常未被捕捉,程序應當中斷,但爲什麼方法test01後面的“-------------”能輸出呢? 原因是在finally中有return,使得方法無論是否有異常,異常是否被捕捉都有一個返回值,因此JVM並不會把它當做會產生異常發生中斷來運行,方法都會正常運行並且返回finally的返回值,不影響後面程序的運行。

要注意的是,當finally有return時:

  • 它會覆蓋try,catch中的return,方法返回的都將是finally中的

  • finally有return時,無論是否有異常,異常是否被捕捉,方法都將正常運行,後面的程序也正常運行





發佈了42 篇原創文章 · 獲贊 2 · 訪問量 7955
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章