溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java異常處理機(jī)制有什么用

發(fā)布時間:2021-11-10 10:45:02 來源:億速云 閱讀:241 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Java異常處理機(jī)制有什么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    1.異常概述與異常體系結(jié)構(gòu)

    1.1異常概述

    異常:在Java語言中,將程序執(zhí)行中發(fā)生的不正常情況稱為“異常”。 (開發(fā)過程中的語法錯誤和邏輯錯誤不是異常)

    Java程序在執(zhí)行過程中所發(fā)生的異常事件可分為兩類:

    Error:Java虛擬機(jī)無法解決的嚴(yán)重問題。如:JVM系統(tǒng)內(nèi)部錯誤、資源耗盡等嚴(yán)重情況。比如:StackOverflowError和OOM。一般不編寫針對性
    的代碼進(jìn)行處理。

    Exception: 其它因編程錯誤或偶然的外在因素導(dǎo)致的一般性問題,可以使
    用針對性的代碼進(jìn)行處理。
    例如:

    空指針訪問試圖讀取不存在的文件網(wǎng)絡(luò)連接中斷數(shù)組角標(biāo)越界

    1.2運(yùn)行時異常與編譯時異常

    對于這些錯誤,一般有兩種解決方法:一是遇到錯誤就終止程序
    的運(yùn)行。另一種方法是由程序員在編寫程序時,就考慮到錯誤的
    檢測、錯誤消息的提示,以及錯誤的處理。

    捕獲錯誤最理想的是在編譯期間,但有的錯誤只有在運(yùn)行時才會發(fā)生。
    比如:除數(shù)為0,數(shù)組下標(biāo)越界等
    分類:編譯時異常和運(yùn)行時異常

    1.運(yùn)行時異常
    是指編譯器不要求強(qiáng)制處置的異常。一般是指編程時的邏輯錯誤,是程序
    員應(yīng)該積極避免其出現(xiàn)的異常。java.lang.RuntimeException類及它的子
    類都是運(yùn)行時異常。
    對于這類異常,可以不作處理,因?yàn)檫@類異常很普遍,若全處理可能會對
    程序的可讀性和運(yùn)行效率產(chǎn)生影響。

    2.編譯時異常
    是指編譯器要求必須處置的異常。即程序在運(yùn)行時由于外界因素造成的一
    般性異常。編譯器要求Java程序必須捕獲或聲明所有編譯時異常。
    l 對于這類異常,如果程序不處理,可能會帶來意想不到的結(jié)果。

    1.3異常體系結(jié)構(gòu)

    Java異常處理機(jī)制有什么用

    2.常見異常

    java.lang.RuntimeException

    ClassCastExceptionArrayIndexOutOfBoundsExceptionNullPointerExceptionArithmeticExceptionNumberFormatExceptionInputMismatchException

    java.io.IOExeption

    FileNotFoundExceptionEOFException

    java.lang.ClassNotFoundException
    java.lang.InterruptedException
    java.io.FileNotFoundException
    java.sql.SQLException

    1. ArrayIndexOutOfBoundsException

    public class IndexOutExp {    public static void main(String[] args) {        String friends[] = { "lisa", "bily", "kessy" };        for (int i = 0; i < 5; i++) {            System.out.println(friends[i]); // friends[4]?        }        System.out.println("\nthis is the end");    }}

    運(yùn)行結(jié)果:數(shù)組越界異常

    Java異常處理機(jī)制有什么用

    2.NullPointerException

    public class NullRef{    int i = 1;    public static void main(String[] args){        NullRef t = new NullRef();        t = null;        System.out.println(t.i);    } }

    運(yùn)行結(jié)果:空指針異常

    Java異常處理機(jī)制有什么用

    3.ArithmeticException

    public class DivideZero{    int x;    public static void main(String[] args){    int y;    DivideZero c=new DivideZero();    y=3/c.x;     System.out.println("program ends ok!");    }}

    運(yùn)行結(jié)果:除零異常

    Java異常處理機(jī)制有什么用

    4.ClassCastException

    public class Order{    public static void main(String[] args){    Object obj = new Date();    Order order;    order = (Order) obj;    System.out.println(order);    }}

    運(yùn)行結(jié)果:類轉(zhuǎn)換異常

    Java異常處理機(jī)制有什么用

    3.異常處理機(jī)制

    3.1異常的拋出與捕獲

    Java提供的是異常處理的抓拋模型

    拋出異常
    Java程序的執(zhí)行過程中如出現(xiàn)異常,會生成一個異常類對象,該異常對象將被提交給Java運(yùn)行時系統(tǒng),這個過程稱為拋出(throw)異常。

    異常對象的生成

    由虛擬機(jī)自動生成:程序運(yùn)行過程中,虛擬機(jī)檢測到程序發(fā)生了問題,如果在當(dāng)前代碼中沒有找到相應(yīng)的處理程序,就會在后臺自動創(chuàng)建一個對應(yīng)異常類的實(shí)例對象并拋出——自動拋出由開發(fā)人員手動創(chuàng)建:Exception exception = new ClassCastException();——創(chuàng)建好的異常對象不拋出對程序沒有任何影響,和創(chuàng)建一個普通對象一樣

    異常的拋出機(jī)制:

    Java異常處理機(jī)制有什么用

    捕獲異常

    如果一個方法內(nèi)拋出異常,該異常對象會被拋給調(diào)用者方法中處理。如果異常沒有在調(diào)用者方法中處理,它繼續(xù)被拋給這個調(diào)用方法的上層方法。這個過程將一直繼續(xù)下去,直到異常被處理。這一過程稱為捕獲(catch)異常。

    如果一個異?;氐絤ain()方法,并且main()也不處理,則程序運(yùn)
    行終止。

    程序員通常只能處理Exception,而對Error無能為力。

    3.2異常處理機(jī)制:try-catch-finally

    異常處理是通過try-catch-finally語句實(shí)現(xiàn)的

    try{...... //可能產(chǎn)生異常的代碼}catch( ExceptionName1 e ){...... //當(dāng)產(chǎn)生ExceptionName1型異常時的處置措施}catch( ExceptionName2 e ){...... //當(dāng)產(chǎn)生ExceptionName2型異常時的處置措施}[ finally{...... //無論是否發(fā)生異常,都無條件執(zhí)行的語句} ]

    try
    捕獲異常的第一步是用try{…}語句塊選定捕獲異常的范圍,將可能出現(xiàn)
    異常的代碼放在try語句塊中。

    catch (Exceptiontype e)
    在catch語句塊中是對異常對象進(jìn)行處理的代碼。每個try語句塊可以伴隨
    一個或多個catch語句,用于處理可能產(chǎn)生的不同類型的異常對象。

    finally
    捕獲異常的最后一步是通過finally語句為異常處理提供一個
    統(tǒng)一的出口,不論在try代碼塊中是否發(fā)生了異常事件,catch語句是否執(zhí)
    行,catch語句是否有異常,catch語句中是否有return,finally塊中的語句都會被執(zhí)行。

    捕獲異常的有關(guān)信息:
    與其它對象一樣,可以訪問一個異常對象的成員變量或調(diào)用它的
    方法。

    getMessage() 獲取異常信息,返回字符串printStackTrace() 獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。

    舉例:指針越界

    public class IndexOutExp{    public static void main(String[] args){    String friends[] = { "lisa", "bily", "kessy" };    try{        for (int i = 0; i < 5; i++) {            System.out.println(friends[i]);    }    }catch (ArrayIndexOutOfBoundsException e){        System.out.println("index err");    }    System.out.println("\nthis is the end");    }}//程序IndexOutExp.java運(yùn)行結(jié)果:java IndexOutExplisabilykessyindex errthis is the end

    5.用戶自定義異常類

    一般地,用戶自定義異常類都是RuntimeException的子類。

    自定義異常類通常需要編寫幾個重載的構(gòu)造器。 l 自定義異常需要提供serialVersionUID自定義的異常通過throw拋出。自定義異常最重要的是異常類的名字,當(dāng)異常出現(xiàn)時,可以根據(jù)名字判斷異常類型。

    用戶自定義異常類MyException,用于描述數(shù)據(jù)取值范圍錯誤信息。用戶
    自己的異常類必須繼承現(xiàn)有的異常類

    public class Test {  private static String userName = "admin";  private static String password = "123456";  public static void main(String[] args) {  login("admin", "123456");  }  public static void login(String userName, String password) {  if (!Test.userName.equals(userName)) {  // TODO 處理用戶名錯誤 }  if (!Test.password.equals(password)) {  // TODO 處理密碼錯誤 }  System.out.println("登陸成功");  } }

    此時我們在處理用戶名密碼錯誤的時候可能就需要拋出兩種異常. 我們可以基于已有的異常類進(jìn)行擴(kuò)展(繼承), 創(chuàng)建和我們業(yè)務(wù)相關(guān)的異常類

    class UserError extends Exception {  public UserError(String message) {  super(message);  } } class PasswordError extends Exception {  public PasswordError(String message) {  super(message);  } }

    此時我們的 login 代碼可以改成

    public static void main(String[] args) {  try {  login("admin", "123456");  } catch (UserError userError) {  userError.printStackTrace();  } catch (PasswordError passwordError) {  passwordError.printStackTrace();  } } public static void login(String userName, String password) throws UserError, PasswordError {  if (!Test.userName.equals(userName)) {  throw new UserError("用戶名錯誤");  }  if (!Test.password.equals(password)) {  throw new PasswordError("密碼錯誤");  }  System.out.println("登陸成功"); }

    注意事項(xiàng):
    自定義異常通常會繼承自 Exception 或者 RuntimeException
    繼承自 Exception 的異常默認(rèn)是受查異常
    繼承自 RuntimeException 的異常默認(rèn)是非受查異常

    6.異常處理5個關(guān)鍵字

    Java異常處理機(jī)制有什么用

    感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Java異常處理機(jī)制有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI