標籤:ext 路徑 sage def 資料 div final 運行時異常 搜尋
2017-10-16 19:39:57
異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。
比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(11/0),那麼你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
異常發生的原因有很多,通常包含以下幾大類:
- 使用者輸入了非法資料。
- 要開啟的檔案不存在。
- 網路通訊時串連中斷,或者JVM記憶體溢出。
一、程式的問題:Throwable
~ 錯誤:ERROR,不處理,這種問題一般比較嚴重,比如記憶體溢出等,需要進一步解決;
~ 異常:Exception
* 編譯期的異常:不是RuntimeException的異常都需要也是必須被處理的,如果不處理編譯器不能通過。常見編譯異常有:IOException(流傳輸異常),SQLException(資料庫操作異常)等。
* 運行期的異常:RuntimeException異常,這類異常在代碼編寫的時候不會被編譯器所檢測出來,是可以不需要被捕獲,但是程式員也可以根據需要進行捕獲拋出。常見的RUNtimeException有:NullpointException(null 指標異常),ClassCastException(類型轉換異常),IndexOutOfBoundsException(數組越界異常)等。
如果程式出現問題,但是程式員沒有作出任何處理,最終JVM會作出預設的處理。
也就是把異常的名稱,原因以及出現的行號等資訊輸出在控制台上。
同時會結束程式。
二、解決方案
try{ 可能出現問題的代碼; 儘可能少; }catch(異常名 變數1){ 針對問題的處理;}catch(異常名 變數2){ 針對問題的處理;}finally{ 無論有無異常都會執行,一般只在檔案關閉,斷開網路連接時使用;}
* 產生異常對象並中斷當前執行的代碼,拋出異常對象。
* 自動按程式中的catch的編寫順序尋找“最接近的”異常匹配,一旦找到就認為當前的異常已經得到控制,不再進一步搜尋。另外,catch中必須對相應的異常作出處理,否則便失去了意義。
* 若有匹配則執行相應的處理代碼,然後繼續執行try塊之後的代碼,否則的話,這個沒有被捕獲的異常將進行預設的異常處理,由JVM進行處理,在控制台輸出相關資訊,並退出程式的運行。
* 無論什麼情況都不會返回出錯的地方繼續執行。
* 能明確的異常盡量明確,不要只用大的Exception來處理
* 目前也可以使用catch(異常1 | 異常2 |... 異常名),來進行多種異常的處理。但是,處理方式是一致的,並且多個異常間必須是平級關係。
* 異常的常用方法:e.getMessage():返回異常的訊息字串
e.toString():返回異常的簡單資訊描述,“包括類的全路徑名:錯誤名 時間”
e.printStackTrace():擷取異常的簡單資訊描述,相當與調用toString方法,並且還會輸出行號的資訊
* finally前退出JVM的話,則不會執行finally;如果前面有return ,則依然會執行finally語句,在執行完後在回去進行返回,且不會改變原返迴路徑中的傳回值。
如果一個方法沒有捕獲一個編譯期異常,那麼該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。會將方法中的異常拋給調用者處理。
也可以使用 throw 關鍵字拋出一個異常,無論它是新執行個體化的還是剛捕獲到的。
import java.io.*;public class className{ public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition}
三、自訂的異常
在 Java 中你可以自訂異常。編寫自己的異常類時需要記住下面的幾點。
- 所有異常都必須是 Throwable 的子類。
- 如果希望寫一個編譯時間異常類,則需要繼承 Exception 類。
- 如果你想寫一個運行時異常類,那麼需要繼承 RuntimeException 類。
- 構造方法有兩個一個無參,一個有參,主要用來把異常資訊列印到控制台上。
public class MyException extends Exception
{
public MyException(){};
public MyException(String message) { super(message); }
}
四、異常在繼承中的注意事項
- 子類重寫父類方法的時候,子類必須拋出與父類一致的異常或者父類異常的子類(父親壞,子類能更壞)
- 如果父類方法沒有異常拋出,那麼子類中覆蓋的方法也不可以將異常拋出,可以使用try塊進行處理
Java-異常處理