成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JAVA學(xué)習(xí)之路 (七)異常

Nekron / 2995人閱讀

摘要:阻止當(dāng)前方法或作用域的,稱為異常。一非檢查異常和,以及她們的子類(lèi)。強(qiáng)制要求對(duì)這類(lèi)異常做預(yù)備處理使用或者。這樣的異常一般是由程序的運(yùn)行環(huán)境導(dǎo)致的。后跟的是異常對(duì)象,或者異常對(duì)象的引用。

異常 什么是異常
相異與常態(tài),和正常情況下不一致,有錯(cuò)誤出現(xiàn)。 阻止當(dāng)前方法或作用域的,稱為異常。

異常分類(lèi)

Throwable類(lèi)是Java異常類(lèi)型的頂層父類(lèi),一個(gè)對(duì)象只有是 Throwable 類(lèi)的(直接或者間接)實(shí)例,他才是一個(gè)異常對(duì)象,才能被異常處理機(jī)制識(shí)別。JDK中內(nèi)建了一些常用的異常類(lèi),我們也可以自定義異常

Throwable又派生出Error類(lèi)Exception類(lèi)。

Error

錯(cuò)誤: Error類(lèi)以及他的子類(lèi)的實(shí)例,代表了JVM本身的錯(cuò)誤。錯(cuò)誤不能被程序員通過(guò)代碼處理,Error很少出現(xiàn)。因此,程序員應(yīng)該關(guān)注Exception為父類(lèi)的分支下的各種異常類(lèi)。

Exception

Exception以及他的子類(lèi),代表程序運(yùn)行的發(fā)生的各種不同不期望的事件,可以被java的異常處理機(jī)制所捕獲,是異常處理的核心。

總體上我們根據(jù)Javac對(duì)異常的處理要求,將異常類(lèi)分為2類(lèi)。

一、非檢查異常
Error和RuntimeException,以及她們的子類(lèi)。javac在比那一的時(shí)候,不會(huì)提示和發(fā)現(xiàn)這樣的異常,不要求用程序去處理這些異常,所以,最好的解決辦法就是,我們應(yīng)該是修正代碼,而不是捕獲異常處理,這樣的異常多半是代碼寫(xiě)的有誤。

如除0錯(cuò)誤ArithmeticException,錯(cuò)誤的強(qiáng)制類(lèi)型轉(zhuǎn)換錯(cuò)誤ClassCastException,數(shù)組索引越界ArrayIndexOutOfBoundsException,使用了空對(duì)象NullPointerException等等。
二、檢查異常
除了Error 和 RuntimeException的其它異常。javac強(qiáng)制要求對(duì)這類(lèi)異常做預(yù)備處理(使用 try..catch..finally或者throws)。

在方法中要么用try-catch語(yǔ)句捕獲它并處理,要么用throws子句聲明拋出它,否則編譯不會(huì)通過(guò)。這樣的異常一般是由程序的運(yùn)行環(huán)境導(dǎo)致的。程序員就應(yīng)該為這樣的異常時(shí)刻準(zhǔn)備著。
異常處理

try-catch

當(dāng)遇到異常時(shí),就會(huì)中斷執(zhí)行,然后程序的控制權(quán)將會(huì)移交catch中的異常處理程序

try會(huì)拋出很多種類(lèi)型的異常

針對(duì)不同的異常,在不同的catch中處理,但是我們?nèi)匀恍枰⒁庖幌拢?(先寫(xiě)子類(lèi)后寫(xiě)父類(lèi))

try-catch-finally

實(shí)例
package tryCatchDemo;

public class Testdemo {
    
    public int test() {
        int initNum = 10;
        int result = 100;
        try {
            while(initNum > -1) {
                initNum --;
                result = result + 100/initNum;
            }
            return result;
        }catch(Exception e) {
            e.printStackTrace(); // 打印出錯(cuò)誤
            System.out.println("循環(huán)異常");
            return -1;
        }
    }
}
package tryCatchDemo;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Testdemo t = new Testdemo();
        int result = t.test();
        System.out.println("拋出異常了,此時(shí)返回值為"+ result);
    }

}

修改一下

public int test1() {
        int initNum = 10;
        int result = 100;
        try {
            while(initNum > -1) {
                initNum --;
                result = result + 100/initNum;
            }
            return result;
        }catch(Exception e) {
            e.printStackTrace(); // 打印出錯(cuò)誤
            System.out.println("循環(huán)異常");
            return -1;
        }finally{
            System.out.println("最終執(zhí)行!!");
            return 999;
        }
    }

再修改一下

public int test2() {
        int initNum = 10;
        int result = 100;
        try {
            while(initNum > -1) {
                initNum --;
                result = result + 100/initNum;
            }
            return result;
        }catch(Exception e) {
            e.printStackTrace(); // 打印出錯(cuò)誤
            System.out.println("循環(huán)異常");
            return result = 1000;
        }finally{
            System.out.println("最終執(zhí)行!!");
            System.out.println("此時(shí)result的值為!!"+result);
        }
    }

異常的拋出

throw 將產(chǎn)生的異常拋出(強(qiáng)調(diào)的是動(dòng)作)

throws 如果一個(gè)方法可能會(huì)出現(xiàn)異常,但沒(méi)有能力處理這種異常,可以在方法聲明處用throws子句來(lái)聲明拋出異常。

實(shí)例

package throw_demo1;

public class newError {
    // 定義一個(gè)方法,拋出 數(shù)組越界和算術(shù)異常(多個(gè)異常 用 "," 隔開(kāi))
    public void Test1(int x) throws ArrayIndexOutOfBoundsException,ArithmeticException{

        System.out.println(x);
    
        if(x == 0){
    
            System.out.println("沒(méi)有異常");
            return;
        }
    
        //數(shù)據(jù)越界異常
        else if (x == 1){
    
            int[] a = new int[3];
             a[3] = 5;
        }
    
        //算術(shù)異常
        else if (x == 2){
    
            int i = 0;
            int j = 5/0;
        }

    }
}
package throw_demo1;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //創(chuàng)建對(duì)象
        newError object = new newError();

        // 調(diào)用會(huì)拋出異常的方法,用try-catch塊
        try{
            object.Test1(0);
        }catch(Exception e){
            System.out.println(e);
        }
        
        
        // 數(shù)組越界異常
        try{
            object.Test1(1);
        }catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("數(shù)組越界異常:"+e);
        }
        
        // 算術(shù)異常
        try{
            object.Test1(2);
        }catch(ArithmeticException e){
            System.out.println("算術(shù)異常:"+e);
        }

        //使用 throw 拋出異常(可以拋出異常對(duì)象,也可以拋出異常對(duì)象的引用)
        try{
            ArrayIndexOutOfBoundsException  exception = new ArrayIndexOutOfBoundsException();
            // 拋出異常
            throw exception;//new ArrayIndexOutOfBoundsException();

        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("thorw拋出異常:"+e);
        }
    }

}

throw與throws的區(qū)別

1.  throw 在方法體內(nèi)使用,throws 函數(shù)名后或者參數(shù)列表后方法體前
2.  throw 強(qiáng)調(diào)動(dòng)作,而throws 表示一種傾向、可能但不一定實(shí)際發(fā)生
3.  throws 后面跟的是異常類(lèi),可以一個(gè),可以多個(gè),多個(gè)用逗號(hào)隔開(kāi)。throw 后跟的是異常對(duì)象,或者異常對(duì)象的引用。 
自定義異常
class  自定義異常類(lèi) extends 異常類(lèi)型(Exception){
// 因?yàn)楦割?lèi)已經(jīng)把異常信息的操作都完成了,所在子類(lèi)只要在構(gòu)造時(shí),將異常信息傳遞給父類(lèi)通過(guò)super 語(yǔ)句即可。
// 重寫(xiě) 有參 和 無(wú)參  構(gòu)造方法
}
// 一個(gè)DrunkException異常
package throwdemo2;

public class DrunkException extends Exception{
    public DrunkException() {
        super();
    }
    public DrunkException(String msg) {
        super(msg);
    }
}
異常鏈

實(shí)例

// DrunkException.java
package throwdemo2;

public class DrunkException extends Exception{
    public DrunkException() {
        super();
    }
    public DrunkException(String msg) {
        super(msg);
    }
}
//test.java

package throwdemo2;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test ct = new test();
        try {
            ct.test2();
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    // 拋出一個(gè)異常
    public void test1() throws DrunkException{
        throw new DrunkException("你喝多了");
    }
    
    public void test2() {
        try {
            test1();
        }catch(DrunkException e) {
            // 捕獲到test1的異常后,首先拋出一個(gè)運(yùn)行時(shí)異常
            RuntimeException newErr = new RuntimeException("喝酒誤事");
            // 設(shè)置該異常的造成原因?yàn)閠est1拋出的異常
            newErr.initCause(e); //=> 這里是異常鏈的關(guān)鍵
            // 拋出最后異常
            throw newErr;
            
            /**
             * 同樣異常鏈還可以是
             * RuntimeException newErr = new RuntimeException(e);
             * throw newErr;
             */
            
        }
    }

}

總結(jié)
1. 處理運(yùn)行時(shí)異常時(shí),采用邏輯去合理避免,同時(shí)配合try catch處理
2. 在多重catch之后,最好加上catch(Exception e)來(lái)處理可能會(huì)出現(xiàn)的異常
3. 對(duì)于不確定的代碼,也可以加上try catch
4. 盡量去處理異常,切記只是簡(jiǎn)單的e.printStackTrace()去打印
5. 盡量添加finally語(yǔ)句去釋放占用的資源

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76745.html

相關(guān)文章

  • JAVA學(xué)習(xí)之路) package包管理

    摘要:使用包管理中的類(lèi)在開(kāi)發(fā)過(guò)程中需要提供大量的類(lèi),那么這么多類(lèi)會(huì)發(fā)生同名的情形呢答案是肯定的。那么如何處理這種重名問(wèn)題呢管理文件解決同名文件沖突。 使用包(Package)管理Java中的類(lèi) 在開(kāi)發(fā)過(guò)程中需要提供大量的類(lèi),那么這么多類(lèi)會(huì)發(fā)生同名的情形呢?答案是肯定的。那么如何處理這種重名問(wèn)題呢? 1、管理Java文件 2、解決同名文件沖突。Java允許在類(lèi)名前面增加一個(gè)前綴來(lái)限定這個(gè)類(lèi),...

    JaysonWang 評(píng)論0 收藏0
  • 【全棧之路JAVA基礎(chǔ)課程_AJAX原理剖析(20190617v1.0)

    摘要:借鑒圖片僅用于學(xué)習(xí)分享,請(qǐng)尊重原創(chuàng)作者,勿用于商用。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)?;静襟E創(chuàng)建對(duì)象也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象。創(chuàng)建一個(gè)新的請(qǐng)求并指定該請(qǐng)求的方法及驗(yàn)證信息。設(shè)置響應(yīng)請(qǐng)求狀態(tài)變化的函數(shù)。使用和實(shí)現(xiàn)局部刷新。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解...

    biaoxiaoduan 評(píng)論0 收藏0
  • 【全棧之路JAVA基礎(chǔ)課程_AJAX原理剖析(20190617v1.0)

    摘要:借鑒圖片僅用于學(xué)習(xí)分享,請(qǐng)尊重原創(chuàng)作者,勿用于商用。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)?;静襟E創(chuàng)建對(duì)象也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象。創(chuàng)建一個(gè)新的請(qǐng)求并指定該請(qǐng)求的方法及驗(yàn)證信息。設(shè)置響應(yīng)請(qǐng)求狀態(tài)變化的函數(shù)。使用和實(shí)現(xiàn)局部刷新。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解...

    yintaolaowanzi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<