首頁  >  文章  >  Java  >  Java中如何處理異常類型

Java中如何處理異常類型

WBOY
WBOY轉載
2023-04-28 18:46:071316瀏覽

一、異常的描述

程式運行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。異常發生時,任程序自生自滅,立刻退出終止。在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几个异常。

六、finally

通常用于关闭(释放)资源。必须要执行。除非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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除