Java-異常處理

來源:互聯網
上載者:User

標籤: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...finally...
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/throw

如果一個方法沒有捕獲一個編譯期異常,那麼該方法必須使用 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-異常處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.