程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 異常處置

Java 異常處置

編輯:關於JAVA

Java 異常處置。本站提示廣大學習愛好者:(Java 異常處置)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 異常處置正文


異常是順序中的一些錯誤,但並不是一切的錯誤都是異常,並且錯誤有時分是可以防止的。

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

異常發作的緣由有很多,通常包括以下幾大類:

  • 用戶輸出了合法數據。
  • 要翻開的文件不存在。
  • 網絡通訊時銜接中綴,或許JVM內存溢出。

這些異常有的是由於用戶錯誤惹起,有的是順序錯誤惹起的,還有其它一些是由於物理錯誤惹起的。-

要了解Java異常處置是如何任務的,你需求掌握以下三品種型的異常:

  • 反省性異常:最具代表的反省性異常是用戶錯誤或問題惹起的異常,這是順序員無法預見的。例如要翻開一個不存在文件時,一個異常就發作了,這些異常在編譯時不能被復雜地疏忽。
  • 運轉時異常: 運轉時異常是能夠被順序員防止的異常。與反省性異常相反,運轉時異常可以在編譯時被疏忽。
  • 錯誤: 錯誤不是異常,而是脫離順序員控制的問題。錯誤在代碼中通常被疏忽。例如,當棧溢出時,一個錯誤就發作了,它們在編譯也反省不到的。

Exception類的層次

一切的異常類是從java.lang.Exception類承繼的子類。

Exception類是Throwable類的子類。除了Exception類外,Throwable還有一個子類Error 。

Java順序通常不捕捉錯誤。錯誤普通發作在嚴重毛病時,它們在Java順序處置的范圍之外。

Error用來指示運轉時環境發作的錯誤。

例如,JVM內存溢出。普通地,順序不會從錯誤中恢復。

異常類有兩個次要的子類:IOException類和RuntimeException類。

在Java 內置類中(接上去會闡明),有大局部常用反省性和非反省性異常。


Java 內置異常類

Java 言語定義了一些異常類在java.lang規范包中。

規范運轉時異常類的子類是最罕見的異常類。由於java.lang包是默許加載到一切的Java順序的,所以大局部從運轉時異常類承繼而來的異常都可以直接運用。

Java依據各個類庫也定義了一些其他的異常,上面的表中列出了Java的非反省性異常。

異常 描繪 ArithmeticException 當呈現異常的運算條件時,拋出此異常。例如,一個整數"除以零"時,拋出此類的一個實例。 ArrayIndexOutOfBoundsException 用合法索引訪問數組時拋出的異常。假如索引為負或大於等於數組大小,則該索引為合法索引。 ArrayStoreException 試圖將錯誤類型的對象存儲到一個對象數組時拋出的異常。 ClassCastException 當試圖將對象強迫轉換為不是實例的子類時,拋出該異常。 IllegalArgumentException 拋出的異常標明向辦法傳遞了一個不合法或不正確的參數。 IllegalMonitorStateException 拋出的異常標明某一線程曾經試圖等候對象的監視器,或許試圖告訴其他正在等候對象的監視器而自身沒有指定監視器的線程。 IllegalStateException 在合法或不適當的時間調用辦法時發生的信號。換句話說,即 Java 環境或 Java 使用順序沒有處於懇求操作所要求的適當形態下。 IllegalThreadStateException 線程沒有處於懇求操作所要求的適當形態時拋出的異常。 IndexOutOfBoundsException 指示某排序索引(例如對數組、字符串或向量的排序)超出范圍時拋出。 NegativeArraySizeException 假如使用順序試圖創立大小為負的數組,則拋出該異常。 NullPointerException 當使用順序試圖在需求對象的中央運用 null 時,拋出該異常 NumberFormatException 當使用順序試圖將字符串轉換成一種數值類型,但該字符串不能轉換為適當格式時,拋出該異常。 SecurityException 由平安管理器拋出的異常,指示存在平安進犯。 StringIndexOutOfBoundsException 此異常由 String 辦法拋出,指示索引或許為負,或許超出字符串的大小。 UnsupportedOperationException 當不支持懇求的操作時,拋出該異常。

上面的表中列出了Java定義在java.lang包中的反省性異常類。

異常 描繪 ClassNotFoundException 使用順序試圖加載類時,找不到相應的類,拋出該異常。 CloneNotSupportedException 當調用 Object 類中的 clone 辦法克隆對象,但該對象的類無法完成 Cloneable 接口時,拋出該異常。 IllegalAccessException 回絕訪問一個類的時分,拋出該異常。 InstantiationException 當試圖運用 Class 類中的 newInstance 辦法創立一個類的實例,而指定的類對象由於是一個接口或是一個籠統類而無法實例化時,拋出該異常。 InterruptedException 一個線程被另一個線程中綴,拋出該異常。 NoSuchFieldException 懇求的變量不存在 NoSuchMethodException 懇求的辦法不存在

異常辦法

上面的列表是Throwable 類的次要辦法:

序號 辦法及闡明 1 public String getMessage()
前往關於發作的異常的詳細信息。這個音訊在Throwable 類的結構函數中初始化了。 2 public Throwable getCause()
前往一個Throwable 對象代表異常緣由。 3 public String toString()
運用getMessage()的後果前往類的串級名字。 4 public void printStackTrace()
打印toString()後果和棧層次到System.err,即錯誤輸入流。 5 public StackTraceElement [] getStackTrace()
前往一個包括堆棧層次的數組。下標為0的元素代表棧頂,最後一個元素代表辦法調用堆棧的棧底。 6 public Throwable fillInStackTrace()
用以後的調用棧層次填充Throwable 對象棧層次,添加到棧層次任何先前信息中。

捕捉異常

運用try和catch關鍵字可以捕捉異常。try/catch代碼塊放在異常能夠發作的中央。

try/catch代碼塊中的代碼稱為維護代碼,運用 try/catch的語法如下:

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

Catch語句包括要捕捉異常類型的聲明。當維護代碼塊中發作一個異常時,try前面的catch塊就會被反省。

假如發作的異常包括在catch塊中,異常會被傳遞到該catch塊,這和傳遞一個參數到辦法是一樣。

實例

上面的例子中聲明有兩個元素的一個數組,當代碼試圖訪問數組的第三個元素的時分就會拋出一個異常。

// 文件名 : ExcepTest.java
import java.io.*;
public class ExcepTest{

   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

以上代碼編譯運轉輸入後果如下:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

多重捕捉塊

一個try代碼塊前面跟隨多個catch代碼塊的狀況就叫多重捕捉。

多重捕捉塊的語法如下所示:

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

下面的代碼段包括了3個catch塊。

可以在try語句前面添加恣意數量的catch塊。

假如維護代碼中發作異常,異常被拋給第一個catch塊。

假如拋出異常的數據類型與ExceptionType1婚配,它在這裡就會被捕捉。

假如不婚配,它會被傳遞給第二個catch塊。

如此,直到異常被捕捉或許經過一切的catch塊。

實例

該實例展現了怎樣運用多重try/catch。

try
{
   file = new FileInputStream(fileName);
   x = (byte) file.read();
}catch(IOException i)
{
   i.printStackTrace();
   return -1;
}catch(FileNotFoundException f) //Not valid!
{
   f.printStackTrace();
   return -1;
}

throws/throw關鍵字:

假如一個辦法沒有捕捉一個反省性異常,那麼該辦法必需運用throws 關鍵字來聲明。throws關鍵字放在辦法簽名的尾部。

也可以運用throw關鍵字拋出一個異常,無論它是新實例化的還是剛捕捉到的。

上面辦法的聲明拋出一個RemoteException異常:

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

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

例如,上面的辦法聲明拋出RemoteException和InsufficientFundsException:

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

finally關鍵字

finally關鍵字用來創立在try代碼塊前面執行的代碼塊。

無論能否發作異常,finally代碼塊中的代碼總會被執行。

在finally代碼塊中,可以運轉清算類型等收尾善後性質的語句。

finally代碼塊呈現在catch代碼塊最後,語法如下:

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

實例

 public class ExcepTest{

   public static void main(String args[]){
      int a[] = new int[2];
      try{
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      finally{
         a[0] = 6;
         System.out.println("First element value: " +a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}

以上實例編譯運轉後果如下:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

留意上面事項:

  • catch不能獨立於try存在。
  • 在try/catch前面添加finally塊並非強迫性要求的。
  • try代碼後不能既沒catch塊也沒finally塊。
  • try, catch, finally塊之間不能添加任何代碼。

聲明自定義異常

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

  • 一切異常都必需是Throwable的子類。
  • 假如希望寫一個反省性異常類,則需求承繼Exception類。
  • 假如你想寫一個運轉時異常類,那麼需求承繼RuntimeException 類。

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

class MyException extends Exception{
}

只承繼Exception 類來創立的異常類是反省性異常類。

上面的InsufficientFundsException類是用戶定義的異常類,它承繼自Exception。

一個異常類和其它任何類一樣,包括有變量和辦法。

實例

// 文件名InsufficientFundsException.java
import java.io.*;

public class InsufficientFundsException extends Exception
{
   private double amount;
   public InsufficientFundsException(double amount)
   {
      this.amount = amount;
   } 
   public double getAmount()
   {
      return amount;
   }
}

為了展現如何運用我們自定義的異常類,

在上面的CheckingAccount 類中包括一個withdraw()辦法拋出一個InsufficientFundsException異常。

// 文件稱號 CheckingAccount.java
import java.io.*;

public class CheckingAccount
{
   private double balance;
   private int number;
   public CheckingAccount(int number)
   {
      this.number = number;
   }
   public void deposit(double amount)
   {
      balance += amount;
   }
   public void withdraw(double amount) throws
                              InsufficientFundsException
   {
      if(amount <= balance)
      {
         balance -= amount;
      }
      else
      {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
   public double getBalance()
   {
      return balance;
   }
   public int getNumber()
   {
      return number;
   }
}

上面的BankDemo順序示范了如何調用CheckingAccount類的deposit() 和withdraw()辦法。

//文件稱號 BankDemo.java
public class BankDemo
{
   public static void main(String [] args)
   {
      CheckingAccount c = new CheckingAccount(101);
      System.out.println("Depositing $500...");
      c.deposit(500.00);
      try
      {
         System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600...");
         c.withdraw(600.00);
      }catch(InsufficientFundsException e)
      {
         System.out.println("Sorry, but you are short $"
                                  + e.getAmount());
         e.printStackTrace();
      }
    }
}

編譯下面三個文件,並運轉順序BankDemo,失掉後果如下所示:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
        at CheckingAccount.withdraw(CheckingAccount.java:25)
        at BankDemo.main(BankDemo.java:13)

通用異常

在Java中定義了兩品種型的異常和錯誤。

  • JVM(Java虛擬機)異常:由JVM拋出的異常或錯誤。例如:NullPointerException類,ArrayIndexOutOfBoundsException類,ClassCastException類。
  • 順序級異常:由順序或許API順序拋出的異常。例如IllegalArgumentException類,IllegalStateException類。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved