黑馬程序員_Java異常總結

                                                                  ---------------------- android培訓java培訓、期待與您交流! ----------------------

一、什麼是異常?

異常:Exception,就是程序在運行時出現的不正常情況。Java用異常來描述這些不正常的情況
異常有兩種:
編譯時異常
該類異常編譯時,被編譯器檢測,如果沒有進行異常處理(try或拋throws處理),編譯失敗。
該異常被標識,代表可以被處理
運行時異常
該類異常編譯時,編譯器不檢測,不需要try或throws處理
該異常發生時,建議不要進行任何處理,讓程序停止,需要對代碼(流程代碼)進行修正。
異常的好處:1.將問題進行封裝。2.將正常流程代碼和問題處理代碼相分離,方便於閱讀。
二、異常體系:
Throwable
|--Error
|--Exception
Throwable 類是 Java 語言中所有錯誤或異常的超類。
區分錯誤和異常:Error、Exception
Error和Exception都是Throwable的子類。
Error:這是程序中出現的嚴重問題,合理的應用程序不應該試圖捕獲。即,一般不編寫針對性的代碼對其進行處理,如try catch、throw、throws
Exception:程序中出現的非嚴重問題,可以使用針對性的代碼進行處理。


異常體系的特點:異常體系中的所有類和它們的對象都具備可拋性,也就是說可以被throw和throws操作。
並且只有異常體系才具有可拋性。要想使自定義的類具有可拋性就要繼承異常體系中的類,自定義異常。
throw和throws的用法、區別:
throw定義在函數內,用於拋出異常對象。--->throw new IOException();
throws定義在函數上,用於拋出異常類,可拋出多個用逗號隔開。 
其實就是告訴調用方法者,該方法中有異常,調用者必須進行處理。--->throws IOException,RuntimeException

當方法內部使用throw拋出了異常對象,對於編譯時異常,需要進行try處理,若未進行try處理,那麼必須在方法上用throws標記,告訴調用者處理。
   對於運行時異常RuntimeException,不需要進行try處理,也不需要用throws標記。   
Throwable類中的一些方法:
String getMessage():返回此 throwable 的詳細消息字符串 
void printStackTrace() :將此 throwable 及其追蹤輸出至標準錯誤流。如:Test.FuShuException
at Test.Demo.div(FuShuExceptionDemo.java:33)
at Test.FuShuExceptionDemo.main(FuShuExceptionDemo.java:11)
public String toString():返回異常的字符串表達式,包含-->類名:此 throwable 的本地化描述  如:java.lang.ArithmeticException: / by zero
三、異常處理
1.異常處理語句:
try{
需要被檢測的代碼
}
catch(捕獲的異常){
處理異常的代碼
}
finally{
一定會執行的代碼
}
三種組合方式:
1.try{ }
  catch(...){ }
  catch(...){ }
  ...
2.try{ }
finally{ }
3.try{ }
catch(...){ }
...
finally{ }
2.異常處理原則:
1.處理方式有兩種:try或者throws
2.程序中拋出幾個異常,就處理幾個-->一個try對應多個catch,每個catch捕獲一種異常。當多個catch捕獲的異常有繼承關係時,將最高父類放在最下面。
3.當多個catch捕獲的異常有繼承關係時,將父類放在最下面。當沒有繼承關係時,只能執行一個catch,會執行第一個捕獲到的。
4.catch內,需要定義針對性的處理方式。不要不寫,也不要簡單的定義printStackTrace,輸出語句。
當捕獲到的異常,本功能處理不了時,可以繼續在catch中拋出。
try
{
throw new MyException();
}
catch(MyException e)
{
throw e;
}
捕獲到的異常處理不了,並且不屬於該功能處理的異常,可以將異常轉換後,再拋出和該功能相關的異常。
或者異常可以處理,但需要將異常產生的和本功能相關的問題提供出去,讓調用者知道並處理。也可以將異常處理後,轉換成新的異常拋出。
try
{
throw new MyException();
}
catch(MyException e)
{
對MyException進行處理的代碼
throw new NewException();
}

注意:1.finally中定義的通常是關閉資源的代碼。因爲資源必須釋放。
  2.finally通常會被執行到,只有一種情況不會執行。當執行了System.exit(0)退出JVM系統,finally不會執行。
     
面試題:以下兩種情況運行結果是什麼?
public class ExceptionDemo {
public static void main(String[] args) {
try{
int x=2/0;
}
catch(RuntimeException e){
System.out.println("除數爲0 了");
//return ; // 1.執行了return後,回去執行finally,其它不執行
System.exit(0);// 2.執行了System.exit(0),就退出了JVM系統,不會再執行任何語句包括fina
}
finally{
System.out.println("finally");
}
System.out.println("main over");
}
}
運行結果:1.輸出:除數爲0了  finally
  2.輸出:除數爲0了

四、自定義異常:
方法:自定義一個類繼承Exception或RuntimeException
原因:1.爲了讓自定義類具有可拋性
  2.讓自定義類具備操作異常的共性方法。如,getMessage(); printStackTrace();等

自定義的異常中,已經繼承了父類中對信息的描述,如果要自定義描述信息,可以使用父類已有的功能。
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
五、子類方法可以拋出的異常
子類覆蓋父類方法時,只能拋出父類被覆蓋方法拋出的異常或其子異常。
因爲:Fu類是舊代碼,爲了擴展功能、優化代碼等操作,添加了Zi類,舊代碼是不能改動。
  Zi類show方法覆蓋了父類中的方法,並拋出了父類不能捕獲的異常。這導致舊代碼不能使用。

  爲了避免這種錯誤,java中規定子類覆蓋父類方法時,只能拋出父類被覆蓋方法拋出的異常或其子異常。

                                 ---------------------- android培訓java培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net/heima

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章