Java中怎么實(shí)現(xiàn)異常處理

這篇文章給大家介紹Java中怎么實(shí)現(xiàn)異常處理,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括拉薩網(wǎng)站建設(shè)、拉薩網(wǎng)站制作、拉薩網(wǎng)頁制作以及拉薩網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,拉薩網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到拉薩省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

異常的定義

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

1. 異常的體系結(jié)構(gòu)

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)越界

異常的體系結(jié)構(gòu)
 * java.lang.Throwable
 * 		|-----java.lang.Error:一般不編寫針對性的代碼進(jìn)行處理。
 * 		|-----java.lang.Exception:可以進(jìn)行異常的處理
 * 			|------編譯時異常(checked)不會生成字節(jié)碼文件
 * 					|-----IOException
 * 						|-----FileNotFoundException
 * 					|-----ClassNotFoundException
 * 			|------運(yùn)行時異常(unchecked,RuntimeException)
 * 					|-----NullPointerException//空指針異常
 * 					|-----ArrayIndexOutOfBoundsException//數(shù)組角標(biāo)越界
 * 					|-----ClassCastException//類型轉(zhuǎn)化異常
 * 					|-----NumberFormatException//編碼格式異常
 * 					|-----InputMismatchException//輸入不匹配
 * 					|-----ArithmeticException//算術(shù)異常

java中異常類的繼承關(guān)系

Java中怎么實(shí)現(xiàn)異常處理

2. 按照異常發(fā)生的時間可以分為兩類

  • 編譯時異常:執(zhí)行 javac.exe 命令時,可能出現(xiàn)的異常:

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

  • 運(yùn)行時異常:執(zhí)行 java.exe 命令時,出現(xiàn)的異常:

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

Java中怎么實(shí)現(xiàn)異常處理

3.常見的異常類型

//******************以下是運(yùn)行時異常***************************
//ArithmeticException
@Test
public void test6(){
    int a = 10;
    int b = 0;
    System.out.println(a / b);
}

//InputMismatchException
@Test
public void test5(){
    Scanner scanner = new Scanner(System.in);
    int score = scanner.nextInt();
    System.out.println(score);

    scanner.close();
}

//NumberFormatException
@Test
public void test4(){

    String str = "123";
    str = "abc";
    int num = Integer.parseInt(str);	
}

//ClassCastException
@Test
public void test3(){
    Object obj = new Date();
    String str = (String)obj;
}

//IndexOutOfBoundsException
@Test
public void test2(){
    //ArrayIndexOutOfBoundsException
    //		int[] arr = new int[10];
    //		System.out.println(arr[10]);
    //StringIndexOutOfBoundsException
    String str = "abc";
    System.out.println(str.charAt(3));
}

//NullPointerException
@Test
public void test1(){		
    //		int[] arr = null;
    //		System.out.println(arr[3]);

    String str = "abc";
    str = null;
    System.out.println(str.charAt(0));

}

//******************以下是編譯時異常***************************
@Test
public void test7(){
    //		File file = new File("hello.txt");
    //		FileInputStream fis = new FileInputStream(file);
    //		
    //		int data = fis.read();
    //		while(data != -1){
    //			System.out.print((char)data);
    //			data = fis.read();
    //		}
    //		
    //		fis.close();

}

異常的處理

1. java異常處理的抓拋模型

**過程一:"拋"**程序在正常執(zhí)行的過程中,一旦出現(xiàn)異常,就會在異常代碼處生成一個對應(yīng)異常類的對象。并將此對象拋出。一旦拋出對象以后,其后的代碼就不再執(zhí)行。

關(guān)于異常對象的產(chǎn)生:

  • 系統(tǒng)自動生成的異常對象

  • 手動的生成一個異常對象,并拋出(throw

**過程二:"抓"**可以理解為異常的處理方式:① try-catch-finallythrows

2.異常處理方式一:try-catch-finally

2.1 使用說明:
try{
    //可能出現(xiàn)異常的代碼

}catch(異常類型1 變量名1){
    //處理異常的方式1
}catch(異常類型2 變量名2){
    //處理異常的方式2
}catch(異常類型3 變量名3){
    //處理異常的方式3
}
....
    finally{
        //一定會執(zhí)行的代碼
    }

使用說明:

  • finally 是可選的。

  • 使用 try 將可能出現(xiàn)異常代碼包裝起來,在執(zhí)行過程中,一旦出現(xiàn)異常,就會生成一個對應(yīng)異常類的對象,根據(jù)此對象的類型,去 catch 中進(jìn)行匹配

  • 一旦 try 中的異常對象匹配到某一個 catch 時,就進(jìn)入 catch 中進(jìn)行異常的處理。一旦處理完成,就跳出當(dāng)前的 try-catch 結(jié)構(gòu)(在沒寫 finally 的情況。繼續(xù)執(zhí)行其后的代碼)

  • catch中的異常類型如果沒子父類關(guān)系,則誰聲明在上,誰聲明在下無所謂;catch中的異常類型如果滿足子父類關(guān)系,則要求子類一定聲明在父類的上面。否則會報(bào)錯

  • 常用的異常對象處理的方式: ① String getMessage()printStackTrace()

  • try 結(jié)構(gòu)中聲明的變量,再出了 try 結(jié)構(gòu)以后,就不能再被調(diào)用

  • try-catch-finally 結(jié)構(gòu)可以嵌套

如何看待代碼中的編譯時異常和運(yùn)行時異常?

  • 使用 try-catch-finally 處理編譯時異常,是得程序在編譯時就不再報(bào)錯,但是運(yùn)行時仍可能報(bào)錯。相當(dāng)于我們使用 try-catch-finally 將一個編譯時可能出現(xiàn)的異常,延遲到運(yùn)行時出現(xiàn)。

  • 開發(fā)中,由于運(yùn)行時異常比較常見,所以我們通常就不針對運(yùn)行時異常編寫 try-catch-finally 了。但是針對于編譯時異常,一定要考慮異常的處理。

2.2. finally的再說明:
  • finally 是可選的

  • finally 中聲明的是一定會被執(zhí)行的代碼。即使catch中又出現(xiàn)異常了,try 中包含 return 語句,或者catchreturn 包含語句等情況,finally 中的代碼也會被執(zhí)行。

  • 像數(shù)據(jù)庫連接、輸入輸出流、網(wǎng)絡(luò)編程Socket等資源,JVM是不能自動的回收的,我們需要自己手動的進(jìn)行資源的釋放。此時的資源釋放的代碼,就需要聲明在 finally 中。

3. 異常處理方式二:

throws + 異常類型 寫在方法的聲明處。指明此方法執(zhí)行時,可能會拋出的異常類型。 一旦當(dāng)方法體執(zhí)行時,出現(xiàn)異常,仍會在異常代碼處生成一個異常類的對象,此對象滿足 throws 后異常類型時,就會被拋出。異常代碼后續(xù)的代碼,就不再執(zhí)行!

4. 對比兩種處理方式

try-catch-finally 真正的將異常給處理掉了。 throws 的方式只是將異常拋給了方法的調(diào)用者。并沒真正將異常處理掉。

5. 開發(fā)中應(yīng)該如何選擇兩種處理方式?

  • 如果父類中被重寫的方法沒 throws 方式處理異常,則子類重寫的方法也不能使用 throws,意味著如果子類重寫的方法中異常,必須使用 try-catch-finally 方式處理。

  • 執(zhí)行的方法a中,先后又調(diào)用了另外的幾個方法,這幾個方法是遞進(jìn)關(guān)系執(zhí)行的。我們建議這幾個方法使用throws 的方式進(jìn)行處理。而執(zhí)行的方法a可以考慮使用 try-catch-finally 方式進(jìn)行處理。

補(bǔ)充: 方法重寫的規(guī)則之一: 子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型

手動拋出異常對象

1.使用說明

在程序執(zhí)行中,除了自動拋出異常對象的情況之外,我們還可以手動的 throw 一個異常類的對象。

2.經(jīng)典面試題

throwthrows區(qū)別: throw 表示拋出一個異常類的對象,生成異常對象的過程。聲明在方法體內(nèi)。 throws 屬于異常處理的一種方式,聲明在方法的聲明處。

3.代碼示例

class Student{

    private int id;

    public void regist(int id) throws Exception {
        if(id > 0){
            this.id = id;
        }else{
            //手動拋出異常對象
            //			throw new RuntimeException("您輸入的數(shù)據(jù)非法!");
            //			throw new Exception("您輸入的數(shù)據(jù)非法!");
            throw new MyException("不能輸入負(fù)數(shù)");

        }		
    }

    @Override
    public String toString() {
        return "Student [id=" + id + "]";
    }

}

自定義異常類

1.如何自定義異常類

  • 繼承于現(xiàn)的異常結(jié)構(gòu):RuntimeException 、Exception

  • 提供全局常量:serialVersionUID(對類的唯一標(biāo)識)

  • 提供重載的構(gòu)造器

2.代碼示例

public class MyException extends Exception{

    static final long serialVersionUID = -7034897193246939L;

    public MyException(){

    }

    public MyException(String msg){
        super(msg);
    }
}

關(guān)于Java中怎么實(shí)現(xiàn)異常處理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

標(biāo)題名稱:Java中怎么實(shí)現(xiàn)異常處理
分享路徑:http://muchs.cn/article0/gdeioo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈動態(tài)網(wǎng)站、品牌網(wǎng)站制作、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作