Error 子類屬於非檢測異常,因爲無法預知它們的產生時間。若 Java 應用程序內存不足,則隨時可能出現 OutOfMemoryError;起因一般不是應用程序的特殊調用,而是 JVM 自身的問題。另外,Error 一般表示應用程序無法解決的嚴重問題。
RuntimeException 類也屬於非檢測異常,因爲普通 JVM 操作引發的運行時異常隨時可能發生,此類異常一般是由特定操作引發。但這些操作在 Java 應用程序中會頻繁出現。因此,它們不受編譯器檢查與處理或聲明規則的限制。
在 Java 中,所有的異常都有一個共同的祖先 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機制通過 Java 應用程序傳輸的任何問題的共性。
Throwable 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。
Exception(異常)是應用程序中可能的可預測、可恢復問題。一般大多數異常表示中度到輕度的問題。異常一般是在特定環境下產生的,通常出現在代碼的特定方法和操作中。在 EchoInput 類中,當試圖調用 readLine 方法時,可能出現 IOException 異常。
Error(錯誤)表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。
Exception 類有一個重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用操作”引發的錯誤。例如,若試圖使用空值對象引用、除數爲零或數組越界,則分別引發運行時異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。還有一類是非RuntimeException這一類的異常是必須要捕獲的異常(在使用別人的方法的時候別人拋出來的異常我們就必須要捕獲) 而RuntimeException是可以捕獲也可以不捕獲的異常
3.Java異常處理的使用
1.使用try...catch來捕獲異常
try {
//........
} catch (Exception e) {
e.printStackTrace();
}
try {
try {
} catch (Exception e1) {
e1.printStackTrace();
}
} catch (Exception e2) {
e2.printStackTrace();
}
2.在方法上拋出異常
public static void test1() throws Exception{
//.......
}
3. 在方法內部拋出異常(當程序運行到某個語句的時候,一般是程序員自定義異常)
public static void test1(){
if(1<2){
throw MyException();
}
}
4.一般在處理異常之後我們需要關閉一些資源或者臨時文件 這時候我們就需要使用finally關鍵字
finally關鍵字是在方法最後執行的語句塊 不管有沒有異常拋出---在jdbc操作的過程中很常見
public static void test1() throws MyException{
if(1<2){
throw MyException();
}finally{
///最後執行
}
}
5.注意在有異常拋出的方法中當異常拋出的時候 語句會直接跳到catch語句塊中而不會執行有異常語句的下面一些語句
在程序員自定的異常的時候跑出來的時候 我們需要在方法上拋出用來給後面的方法使用
4.Java異常處理的應用實例
在定義銀行類時,若取錢數大於餘額時需要做異常處理。
定義一個異常類 insufficientFundsException。取錢(withdrawal)方法中可能產生異常,條件是餘額小於取額。
處理異常在調用 withdrawal 的時候,因此 withdrawal 方法要聲明拋出異常,由上一級方法調用。
異常類:
class InsufficientFundsException extends Exception {
private Bank excepbank; // 銀行對象
private double excepAmount; // 要取的錢
InsufficientFundsException(Bank ba, double dAmount) {
excepbank = ba;
excepAmount = dAmount;
}
public String excepMessage() {
String str = "The balance is" + excepbank.balance + "\n"
+ "The withdrawal was" + excepAmount;
return str;
}
}
銀行類:class Bank {
double balance;// 存款數
Bank(double balance) {
this.balance = balance;
}
public void deposite(double dAmount) {
if (dAmount > 0.0)
balance += dAmount;
}
public void withdrawal(double dAmount) throws InsufficientFundsException {
if (balance < dAmount)
throw new InsufficientFundsException(this, dAmount);
balance = balance - dAmount;
}
public void showBalance() {
System.out.println("The balance is " + (int) balance);
}
}
測試類:public class ExceptionDemo {
public static void main(String args[]) {
try {
Bank ba = new Bank(50);
ba.withdrawal(100);
System.out.println("Withdrawal successful!");
} catch (InsufficientFundsException e) {
System.out.println(e.toString());
System.out.println(e.excepMessage());
}
}
}