認識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{
// 程序代碼
}
常見異常
- java.lang.NullPointerException(空指針異常)
調用了未經初始化的對象或者是不存在的對象
java.lang.ClassNotFoundException
指定的類不存在這裏主要考慮一下類的名稱和路徑是否正確即可,通常都是程序試圖通 過字符串來加載某個類時可能引發 異常
java.lang.ClassCastException
數據類型轉換異常當試圖將對某個對象強制執行向下轉型,但該對象又不可轉換又不可轉換爲其子類的實例時將引發該異常。
java.lang.IndexOutOfBoundsException
數組下標越界異常java.lang.NumberFormatException
字符串轉換爲數字異常當試圖將一個String轉換爲指定的數字類型,而該字符串確不滿足數字類型要求的格式時,拋出該異常.如現在講字符型的數據“123456”轉換爲數值型數據時,是允許的。
但是如果字符型數據中包含了非數字型的字符,如123#56,此時轉換爲數值型時就會出現異常。系統就會捕捉到這個異常,並進行處理.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: 自定義異常
}
}
}