如果一個方法沒有捕獲一個檢查性異常,那麼該方法必須使用throws 關鍵字來聲明。throws關鍵字放在方法簽名
的尾部。也可以使用throw關鍵字拋出一個異常,無論它是新實例化的還是剛捕獲到的。throw將產生的異常拋出(動
作);throws——聲明將要拋出何種類型的異常(聲明)。
下面方法的聲明拋出一個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關鍵字用來創建在try代碼塊後面執行的代碼塊。無論是否發生異常,finally代碼塊中的代碼總會被執行。在
finally代碼塊中,可以運行清理類型等收尾善後性質的語句。finally代碼塊出現在catch代碼塊最後,語法如下:
try{ // 程序代碼 }catch(異常類型1 異常的變量名1){ // 程序代碼 }catch(異常類型2 異常的變量名2){ // 程序代碼 }finally{ // 程序代碼 }
實例:Test.java源文件代碼:
public class Test{ 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"); } } }
以上實例編譯運行結果如下:
捕獲的異常是數組下標越界。而finally塊中的語句依然執行。
使用注意下面事項:
1)catch不能獨立於try存在。
2)在try/catch後面添加finally塊並非強制性要求的。
3)try代碼後不能既沒catch塊也沒finally塊。
4)try, catch, finally塊之間不能添加任何代碼。
在Java中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點:
1)所有異常都必須是Throwable的子類。
2)如果希望寫一個檢查性異常類,則需要繼承Exception類。
3)如果你想寫一個運行時異常類,那麼需要繼承RuntimeException 類。
使用自定義異常一般步驟如下步驟:
1通過繼承java.lang.Exception類聲明自己的異常類。
2在方法適當的位置生成自定義異常的實例,並用throw語句拋出。
3在方法的聲明部分用throws語句聲明該方法可能拋出的異常。
可以像下面這樣定義自己的異常類:
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,得到結果如下所示:
在Java中定義了兩種類型的異常和錯誤。
JVM(Java虛擬機)異常:由JVM拋出的異常或錯誤。例如:NullPointerException類,
ArrayIndexOutOfBoundsException類,ClassCastException類。
程序級異常:由程序或者API程序拋出的異常。例如IllegalArgumentException類,IllegalStateException類。
1處理運行時異常是,采用邏輯去合理規避同時輔助try-catch處理。
2在多重catch塊後面,可以加一個catch(Exception)來處理可能會被遺漏的異常。
3對於不確定的代碼,也可以加上try-catch,處理潛在的異常。
4盡量取處理異常,切忌只是簡單的調用printStackTrace()去打印輸出。
5具體如何處理異常,要根據不同的業務需求和異常類型去決定。
6盡量添加finally語句塊去釋放占用的資源。