程式運行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。異常發生時,任程序自生自滅,立刻退出終止。在Java中即,Java在編譯或執行或執行過程中出現的錯誤。
Java提供了更優秀的解決方法:例外處理機制。
異常處理機制能讓程式在異常發生時,按照程式碼的預先設定的異常處理邏輯,針對性地處理異常,讓程式盡最大可能恢復正常並繼續執行,且保持程式碼的清晰。
Java中的異常可以是函數中的語句執行時引發的,也可以是程式設計師透過throw 語句手動拋出的,只要在Java程式中產生了異常,就會用一個對應類型的異常物件來封裝異常,JRE就會試圖尋找異常處理程序來處理異常。
異常指在運行時期發生的不正常。
在java中用類別的形式對不正常情況進行了描述和封裝物件。
描述不正常狀況的類,就變成異常類。
將正常程式碼和問題處理程式碼分離,提高閱讀性。
其實異常就是java透過物件導向的想法將問題封裝成了對象,用異常類別來描述。
兩大類別:
hrowable:可拋出的例外,無論是error還是exception,問題發生就應該可以拋出,讓呼叫者知道並且處理。
這個系統的特點就是在於Throwable及其所有的子類別都具有可拋性。
可拋性到底指的是什麼?怎麼體現可拋性呢?
透過兩個關鍵字來體現的。
throws throw 凡是可以被這兩個關鍵字所操作的類別和物件都具有可拋性。
子類別1 一般無法處理的。 ————Error
特點:是由jvm拋出的嚴重性問題,這種問題發生一般不針對性處理,直接修改程式。
子類別2)可以處理的。 ————Exception,問題拋給呼叫者,誰用丟給誰。
特點:子類別後綴名都是用其父類別名稱作為後綴名,閱讀性很強!
範例:例如自訂一個負數角標的異常,使用物件導向思想封裝成物件。
注意:如果讓一個類別稱為異常類,必須要繼承異常類別。因為只有異常體系的子類別才具有可拋性。
class FuShuIndex extends Exception{ //构造函数 和类名一样 FuShuIndex(){ } //定义一个带参数的构造函数 FuShuIndex(String msg){ //调用Exception中的带参数异常函数 super(msg); } } 主函数 throws FuShuIndex:{ int[] arr = new int[3]; method(arr,-7); } public static int method(int[] arr,int index) throws arrIndexexception { if (index<0){ throw new arrIndexexception("数组的角标不能为负数"); } return arr[index]; }
編譯時被偵測異常還要是Exception和其子類別都是,除了特殊子類別RuntimeException體系未處理即編譯失敗!
這種問題一旦出現,希望在編譯時就進行檢測,讓這種問題有對應的處理方式,這樣的問題都可以針對性處理。
編譯時不被偵測異常(執行時例外):RuntimeException和其子類別
可處理可不處理,編譯都可以通過,運行時會檢測!
這種問題的發生,無法讓功能繼續,運算無法運行,更多因為呼叫的原因導致,或引發了內部狀態的改變而導致的。這種問題一般不處理,直接編譯通過,在執行時,讓呼叫者時程式強制停止,讓呼叫者修正程式碼。
throws和throw的區別:
throws使用在函數上 ————申明
##throw使用在函數內,可以拋出多個,用逗號隔開。 ————拋出
throws拋出的是例外類,可以拋出多個。
throw拋出的是例外物件。
四、異常處理的捕捉形式
try{ //需要被检测异常的代码 } catch(异常类 变量)//该变量用于接收发生的异常对象{ //处理异常代码 } finally{ //一定会被执行的代码 }
範例
class FuShuIndex extends Exception{ //构造函数 和类名一样 FuShuIndex(){ } //定义一个带参数的构造函数 FuShuIndex(String msg){ //调用Exception中的带参数异常函数 super(msg); } }
主函數:無需throws拋出,下面我們自己捕獲異常
{ int[] arr = new int[3]; try{ method(arr,-7); }catch(arrIndexexception a){ a.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法。 System.out.println("数组的角标异常!!!");//自定义捕获后打印的信息 System.out.println(a.toString());//打印该异常对象的信息 System.out.println(a.getMessage());//获取我们自定义抛出所定义的信息 } } public static int method(int[] arr,int index) throws arrIndexexception { if (index<0){ throw new arrIndexexception("数组的角标不能为负数"); } return arr[index]; }
一個try對應多個catch:
多catch情況下,父類別的catch要放在最下面,否則編譯為空。
五、異常處理的原則
###函數內部如果拋出了需要檢測的異常,那麼函數上必須申明,或者必須在函數內用try catch捕捉,否則編譯失敗。 ######如果呼叫到了申明異常的函數,要嘛try catch 或 throws ,否則編譯失敗。 ######什麼時候catch?什麼時候throws? ############功能內容可以解決,用catch。 ############解決不了,用throws告訴呼叫者,由呼叫者解決。 ###一个功能如果抛出了多个异常,那么调用时,必须有对应的多个catch来进行针对性处理。
内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个异常。
通常用于关闭(释放)资源。必须要执行。除非jvm虚拟机挂了。
范例:出门玩,必须关门,所以将关门这个动作放在finally里面,必须执行。
凡是涉及到关闭连接等操作,要用finally代码块来释放资源。
try catch finally 代码块组合特点:
try catch finally:当有资源需要释放时,可以定义finally
try catch(多个):当没有资源需要释放时,可以不定义finally
try finally:异常处理不处理我不管,但是我得关闭资源,因为资源是我开的,得在内部关掉资源。
范例:
try{ //连接数据库 } //没有catch意思不处理异常,只单纯的捕获异常 finally{ //关闭连接 }
老师用电脑讲课范例:
电脑类:
public class Computer { private int state = 2; public void run() throws lanpingExcption,maoyanExcption{ if (state == 1){ throw new lanpingExcption("电脑蓝屏啦~"); }else if (state == 2){ throw new maoyanExcption("电脑冒烟啦~"); } System.out.println("电脑启动"); } public void chongqi(){ state = 0; System.out.println("重启电脑!"); } }
老师类:
public class Teacher { private String name; private Computer computer; Teacher(String name){ this.name = name; computer = new Computer(); } void teach() throws maoyanExcption{ try { computer.run(); System.out.println(this.name + "开始用电脑讲课了"); } catch (lanpingExcption l) { l.printStackTrace(); computer.chongqi(); teach();//重启后再次讲课 } catch (maoyanExcption m) { m.printStackTrace(); test(); throw m; } } public void test(){ System.out.println("大家自己练习去~"); } }
蓝屏异常类:
public class lanpingExcption extends Exception{ lanpingExcption (String msg){ super(msg); } }
冒烟异常类:
public class maoyanExcption extends Exception { maoyanExcption (String msg){ super(msg); } }
主函数:
public class Testmain { public static void main (String[] args){ Teacher teacher = new Teacher("丁老师"); try { teacher.teach(); } catch (maoyanExcption m) { //m.printStackTrace(); System.out.println("。。。。。"); } } }
子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
子类覆盖父类,只能抛出父类的异常或者子类。
如果父类的方法没有抛出异常,子类覆盖时绝对不能抛。
以上是Java中如何處理異常類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!