1.異常的概念
在程序開發過程中,可能存在各種錯誤,有些錯誤是可以避免的,而有些錯誤卻是意想不到的,在Java中把這些可能發生的錯誤稱爲異常。
2.異常的分類
在Java中可以捕獲的異常(即Exception類的子類)可分爲可控式異常和運行時異常兩種類型。
2.1 可控式異常
在Java中把那些可以預知的錯誤,例如從文件中讀取數據、對數據庫進行操作等,在程序編譯時就能對程序中可能存在的錯誤進行處理,並給出具體的錯誤信息,這種爲可控式異常。
2.2 運行時異常
在Java中有些錯誤是不能被編譯器檢測到的,例如,在進行除法運算時,除數爲零;試圖把一個不是由數字組成的字符串使用Integer類的parseInt()方法轉化爲 整數等,Java的編譯器是檢測不到的,因而能夠正常編譯,但是在 運行時就會發生異常,這些稱爲運行時異常。
常見異常 例:
1.算數異常
ArithmeticException
x/02.數組下標越界異常
ArrayIndexOutOfBoundsException
數組元素下標值大於數組最大下標值3.空指針異常
java.lang.NullPointerException
當指針爲空時,對此方法進行調用,產生空指針異常 String s=null; s.name;
3.獲取異常信息
在Java中java.lang.Throwable類是所有異常類的超類,該類提供了獲得異常信息的方法。
4.處理異常
4.1 使用try···catch處理異常
try{
需要正常執行的語句
}catch(Exception ex){
對異常進行處理的語句
}
1.try和catch是進行異常處理的關鍵字。
2.try和catch之間的兩個大括號內是程序需要正常執行但又可能發生異常的語句。
3.catch後的兩個小括號內是程序需要處理的異常類型。
4.catch後的兩個大括號內是對程序發生的異常進行處理的語句。
4.2 使用try···catch···finally處理異常
try{
需要執行的語句
}catch(Exception ex){
對異常進行處理的語句
}finally{
一定會被執行的語句
}
要點與try···catch基本相同
finally語句塊通常用於執行垃圾回收、釋放資源等操作。
4.3 使用try···finally處理異常
try{
需要執行的語句
}finally{
一定會執行的語句
}
5.拋出異常
5.1 使用throws聲明拋出異常
數據類型 方法名(形參列表) throws 異常類1,異常類2,···,異常類n{
方法體;
}
1.數據類型是基本數據類型或對象類型。
2.方法名是Java語言的合法標識符。
3.throws是拋出異常的關鍵字。
4.異常類是Java語言的異常類 或自定義異常類。
5.方法體是該方法需要執行的語句。
5.2 使用throw語句拋出異常
程序自行拋出異常,使用throw語句來實現。通常用在方法中,if語句一起使用,拋出異常類的實例。
if(出現異常的條件){
throw new Exception("對異常的說明");
}
1.throw是拋出異常關鍵字
2.Exception是異常類(通常使用自定義異常類)。
例:
方法中拋出異常
public class ThrowException{
public static void throwException(){
throw new UnsupportedOperationException("方法尚未實現"); //拋出異常
}
public static void main(String[] args){
ThrowException.throwException(); //調用拋出異常的方法
}
}
方法上拋出異常
public class ThrowsException{
public static void throwsException() throws ClassNotFoundException{ //拋出異常
Class.foeName("com.mysql.jdbc.Driver");
}
public static void main(String[] args){
try{ //捕獲異常
ThrowsException.throwsException(); //調用拋出異常的方法
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
6.自定義異常
6.1 創建自定義異常類
創建自定義的異常類需要繼承自Exception類,並提供含有一個String類型的形參的構造方法,該形參就是異常的描述信息,可以通過getMessage()方法獲得。例如:
public class NewException extends Exception{
public NewException(String s){
super(s);
}
}
上面的代碼創建了一個名爲 NewException的自定義異常類,該類繼承自Exception類,該類構造方法的形參s 是需要傳遞異常描述 信息。該信息可以通過getMessage()方法獲得。
6.2 使用自定義異常類
創建完自定義異常類後,就可以在程序中使用,使用自定義異常類可以通過throw語句拋出異常。例:
public class NewException extends Exception{ //創建自定義異常類
publicNewException(Double r){ //有一個Double類型的形參的構造方法
System.out.println("發生異常:圓的半徑不能小於20");
System.out.println("圓的半徑爲:"+r);
}
}
7.異常的使用規則
- 不要過多的使用異常,這樣會增加系統的負擔。
- 在方法中使用try···catch語句塊捕獲異常時,要對異常作出處理。
- try···catch語句塊的範圍不要太大,這樣會不利於對異常的分析。
- 一個方法被覆蓋時,覆蓋它的方法必須拋出相同的異常或者子異常。
8.經典範例
8.1 捕獲單個異常
例:
public class CatchException{
public static xoid main(String[] args){
try{ //定義try語句塊
System.out.println("進入try語句塊");
@SuppressWarnings("unused")
Class<?>clazz = Class.forName(""); //得到一個空的Class對象
System.out.println("離開try語句塊");
}catch(ClassNotFoundException e){ //定義catch語句塊
System.out.println("進入catch語句塊");
e.printStackTrace();
System.out.println("離開catch語句塊");
}finally{ //定義finally語句塊
System.out.println("進入finally語句塊");
}
}
}
8.2 數據庫操作異常
public classExceptionTest{
public static void main(String[] args){
String URL = "jdbc:mysql://localhost:3306/db_database"; //MySQL數據庫的URL
String DRIVER = "com.mysql.jdbc.Driver"; //MySQL數據庫的驅動
String USERNAME = "mr"; //數據庫的用戶名
Connrction connection = null;
try{
Class.forName(DRIVER); //加載驅動
//建立連接
connection = DriverManager.getConnection(URL,USERNAME,"");
}catch(SQLException e){ //捕獲SQLException
e.printStackTrace();
}catch(ClassNotFoundException e){ //捕獲ClassNotFoundException
e.printStackTrace();
}finally{
try{
connection.close(); //釋放資源
}catch(SQLException e){
e.printStackTrace();
}
}
}
}