java 異常

認識java異常

異常是程序中的一些錯誤,但不是所有的錯誤都是異常,並且有時錯誤是可以避免的。

比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;
如果你用System.out.println(11/0),那麼你是因爲你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。

異常發生的原因有很多,通常包含以下幾大類:

  • 用戶輸入非法數據
  • 打開的文件不存在
  • 網絡通信時網絡中斷,或者JVM內存溢出

這裏面有的是用戶引起的,有的是程序錯誤引起的,還有的則是物理錯誤引起的!

要理解java異常是如何工作的,就必須如下三種異常:

  • 檢查性異常
  • 運行時異常
  • 錯誤

處理異常

try
{
   // 程序代碼
}catch(ExceptionName e1)
{
   //Catch 塊
}

Catch 語句包含要捕獲異常類型的聲明。當保護代碼塊中發生一個異常時,try 後面的 catch 塊就會被檢查。如果發生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個參數到方法是一樣。

多重捕獲塊

一個 try 代碼塊後面跟隨多個 catch 代碼塊的情況就叫多重捕獲。
多重捕獲塊的語法如下所示:


try{
   // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}

上面的代碼段包含了 3 個 catch塊。
可以在 try 語句後面添加任意數量的 catch 塊。
如果保護代碼中發生異常,異常被拋給第一個 catch 塊。
如果拋出異常的數據類型與 ExceptionType1 匹配,它在這裏就會被捕獲。
如果不匹配,它會被傳遞給第二個 catch 塊。
如此,直到異常被捕獲或者通過所有的 catch 塊。

finally關鍵字

finally 關鍵字用來創建在 try 代碼塊後面執行的代碼塊。
無論是否發生異常,finally 代碼塊中的代碼總會被執行。
在 finally 代碼塊中,可以運行清理類型等收尾善後性質的語句。
finally 代碼塊出現在 catch 代碼塊最後,語法如下:


try{
  // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}finally{
  // 程序代碼
}

常見異常

  1. java.lang.NullPointerException(空指針異常)
      調用了未經初始化的對象或者是不存在的對象
     
  2. java.lang.ClassNotFoundException
    指定的類不存在

    這裏主要考慮一下類的名稱和路徑是否正確即可,通常都是程序試圖通 過字符串來加載某個類時可能引發 異常

  3. java.lang.ClassCastException
    數據類型轉換異常

    當試圖將對某個對象強制執行向下轉型,但該對象又不可轉換又不可轉換爲其子類的實例時將引發該異常。

  4. java.lang.IndexOutOfBoundsException
    數組下標越界異常

  5. java.lang.NumberFormatException
    字符串轉換爲數字異常

    當試圖將一個String轉換爲指定的數字類型,而該字符串確不滿足數字類型要求的格式時,拋出該異常.如現在講字符型的數據“123456”轉換爲數值型數據時,是允許的。
    但是如果字符型數據中包含了非數字型的字符,如123#56,此時轉換爲數值型時就會出現異常。系統就會捕捉到這個異常,並進行處理.

  6. java.lang.ArithmeticException
    數學運算異常

    當算術運算中出現了除以零這樣的運算就會出這樣的異常。

throws關鍵字

如果一個方法沒有捕獲一個檢查性異常,那麼該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。


import java.io.*;
public class className
{
  public void deposit(double amount) throws RemoteException
  {
    // Method implementation
    throw new RemoteException();
  }
  //Remainder of class definition
}

一個方法可以聲明拋出多個異常,多個異常之間用逗號隔開。


import java.io.*;
public class className
{
   public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
   {
       // Method implementation
   }
   //Remainder of class definition
}

自定義異常

在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。

  • 所有異常都必須是 Throwable 的子類。
  • 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
  • 如果你想寫一個運行時異常類,那麼需要繼承 RuntimeException 類。

    可以像下面這樣定義自己的異常類:


class MyException extends Exception{
}

例子:

package com.lang.exception;

import javax.swing.plaf.metal.MetalScrollBarUI;

class MyException extends Exception {
    public MyException(String msg) {
        super(msg);
    }
}

public class ExceptionDemo {

    public static void main(String[] args) {
        try {
            throw new MyException("自定義異常");
        } catch (Exception e) {
            System.out.println(e); // 輸出:com.lang.exception.MyException: 自定義異常
        }

    }

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