日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java中的異常處理機(jī)制

 印度阿三17 2019-04-21

一、異常概述

 異常是為了反饋和處理/解決問(wèn)題設(shè)計(jì)的一套機(jī)制。異常的頂級(jí)父類是Throwable,它有兩個(gè)子類:Error、Exception。下面分別詳細(xì)介紹二者。

二、異常的特點(diǎn)

 1、Exception的定義:表示在合理的應(yīng)用程序中出現(xiàn)的可以處理的問(wèn)題。

 2、異常的分類:

  • 編譯時(shí)異常:在編譯的時(shí)候就出現(xiàn)并要求處理的異常。比如CloneNotSupportedException  ParseException

  • 運(yùn)行時(shí)異常:在編譯的時(shí)候不出現(xiàn),到了運(yùn)行的時(shí)候才會(huì)報(bào)錯(cuò)。在使用的時(shí)候可以處理,如果不處理在運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)。比如:RuntimeException  NullPointerException ArrayIndexOutOfBoundsException  ClassCastException等。

  3、異常的處理方式:

  • 繼續(xù)向上拋出:throws

  • 可以捕獲:try-catch

4、自定義異常:如果在實(shí)際開發(fā)過(guò)程中,遇到了問(wèn)題但是在java中沒(méi)有對(duì)應(yīng)的異常,那么就需要自己定義一個(gè)異常。

      如果定義的是一個(gè)編譯時(shí)異常,寫一個(gè)類繼承Exception。

      如果需要定義一個(gè)運(yùn)行時(shí)異常,需要繼承RuntimeException。

      示例如下:

public class ExceptionDemo2 {public static String readTxtFile(String path) throws PathNotExistException, FileFormatException {

        // 路徑問(wèn)題
        if (!new File(path).exists())
            // 需要將拋出的問(wèn)題以對(duì)象的形式來(lái)進(jìn)行封裝
            // 如果跑出了異常對(duì)象,那么該方法的后續(xù)代碼不再執(zhí)行
            throw new PathNotExistException("親,這個(gè)路徑不存在哦~~~");

        // 文件格式不正確
        if (!path.endsWith(".txt")) {
            // xxxx.xxx.xxx
            int index = path.lastIndexOf('.');
            String suffix = path.substring(index   1);
            throw new FileFormatException("需要一個(gè)txt文件,但是傳入一個(gè)"   suffix   "文件");
        }

        // 正常讀取
        return "讀取成功~~~";
    }

}

@SuppressWarnings("serial")
class PathNotExistException extends Exception {

    // private String message;

    public PathNotExistException(String msg) {
        // this.message = msg;
        super(msg);
    }

    // public String getMessage() {
    // return message;
    // }

}

@SuppressWarnings("serial")
class FileFormatException extends Exception {

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

}

5、異常的捕獲方式

  • 分別處理:每一個(gè)異常分別對(duì)應(yīng)一個(gè)catch,適合于每一個(gè)異常的處理方式各不一樣的情況。

  • 統(tǒng)一處理:如果所有的異常處理方式都一樣,那么可以統(tǒng)一捕獲一個(gè)父類異常對(duì)象。

  • 分組處理:如果異常之間的處理方式進(jìn)行了分組,那么同一組異常之間可以用 “|”隔開 ---從JDK1.7開始。

 public static void main(String[] args) /* throws FileFormatException */ {
        //1.分別處理異常
        // try {
        // String msg = readTxtFile("D:\\a.bmp");
        // System.out.println(msg);
        // } catch (PathNotExistException e) {
        // // 處理問(wèn)題
        // // System.out.println("捕獲到了一個(gè)問(wèn)題:路徑不存在~~~");
        // System.out.println(e.getMessage());
        // } catch (FileFormatException e) {
        // // System.out.println("文件格式不正確~~~");
        // System.out.println(e.getMessage());
        // }
        
        //2. 統(tǒng)一處理
        // try {
        // String msg = readTxtFile("D:\\a.bmp");
        // System.out.println(msg);
        // } catch (Exception e) {
        // System.out.println(e.getMessage());
        // }
        
        //3.分組處理
        try {
            String msg = readTxtFile("D:\\a.bmp");
            System.out.println(msg);
        } catch (PathNotExistException | FileFormatException e) {
            // 表示捕獲PathNotExistException或者是FileFormatException
            System.out.println(e.getMessage());
        }
    }

6、異常對(duì)方法的重載沒(méi)有影響。

// 異常對(duì)方法的重載的有影響嗎?
class A {

    public void m() throws IOException {
        System.out.println("A m()");
    }

    public void m(int i) throws ParseException {
        System.out.println("A m(int)");
    }

}

class B extends A {

    public void m() throws EOFException, FileNotFoundException, NullPointerException {
        System.out.println("B m()");
    }

}

7、異常對(duì)方法重寫的影響:在方法重寫的時(shí)候,子類中重寫的方法拋出的編譯時(shí)異常不能超過(guò)父類方法拋出的編譯時(shí)異常的范圍。即:子類不能拋出比父類更高級(jí)的異常。

8、finally:無(wú)論前邊的代碼執(zhí)行成功與否,finally中的代碼都會(huì)執(zhí)行一次。內(nèi)存中的??梢苑譃橛?jì)算區(qū)和結(jié)果區(qū);當(dāng)try檢測(cè)到finally時(shí),程序還是會(huì)順序執(zhí)行。只不過(guò)會(huì)返回結(jié)果會(huì)延遲,此時(shí),當(dāng)執(zhí)行到try中的return語(yǔ)句時(shí),會(huì)先將結(jié)果存儲(chǔ)到結(jié)果區(qū),等到finally程序執(zhí)行完畢后,再將結(jié)果返回。如果try 和  finally都有return語(yǔ)句,這以finally返回語(yǔ)句為準(zhǔn)。例如如下實(shí)例返回結(jié)果為5。

public static void main(String[] args) {

        System.out.println(m());

    }
    private static int m() {

        int i = 5;

        try {
            // 代碼依然是從上到下順次執(zhí)行的
            // 在執(zhí)行try之前會(huì)先檢測(cè)是否有finally
            // 如果有finally,那么會(huì)將try中的返回過(guò)程推后
            // 棧內(nèi)存的結(jié)構(gòu):計(jì)算區(qū)域,結(jié)果區(qū)域  -> 棧幀
            // 實(shí)際執(zhí)行過(guò)程:try->finally->方法返回實(shí)際結(jié)果
            // 先執(zhí)行try中的代碼
            // 執(zhí)行return語(yǔ)句,只是將結(jié)果放入結(jié)果區(qū)域
            // i在計(jì)算區(qū)域繼續(xù)自增為6
            return i  ;
        } finally {
            // 繼續(xù)執(zhí)行finally
            // i在計(jì)算區(qū)域繼續(xù)自增為7
            // 執(zhí)行完成finally,方法會(huì)將結(jié)果區(qū)域的值進(jìn)行返回
            i  ;
            System.out.println("finally:"   i);
        }

    }

   當(dāng)返回的是一個(gè)引用類型時(shí),由于finally中值的改變是改變的結(jié)果區(qū)的數(shù)據(jù),因此,此時(shí)會(huì)影響到返回結(jié)果。例如:

public class ExceptionDemo8 {

    public static void main(String[] args) {
        System.out.println(m());
    }

    private static Student m() {

        Student s = new Student();

        try {
            s.setName("翠花");
            s.setAge(18);
            // 因?yàn)榻Y(jié)果區(qū)域存儲(chǔ)的是s的地址
            return s;
        } finally {
            s = new Student();
            s.setName("周星星");
            s.setAge(80);
        }

    }

}

class Student {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [name="   name   ", age="   age   "]";
    }

}

 此時(shí),返回的結(jié)果是:周星星,80

9、如果方法拋出的是父類異常,那么使用的時(shí)候也必須捕獲一個(gè)父類異常;再捕獲異常的時(shí)候,必須先捕獲子類異常后捕獲父類異常。原因:如果先捕獲父類異常,父類異常中已經(jīng)包含子類異常,就會(huì)報(bào)錯(cuò)了。

10、當(dāng)項(xiàng)目處在開發(fā)期間是,如果項(xiàng)目中出現(xiàn)了異常,打印這個(gè)異常的棧軌跡,然后根據(jù)這個(gè)軌跡進(jìn)行調(diào)錯(cuò);如果項(xiàng)目已經(jīng)上線,出現(xiàn)了異常,記錄錯(cuò)誤日志。

三、Error

1、表示嚴(yán)重的錯(cuò)誤。

2、出現(xiàn)之后不能處理。

3、出現(xiàn)之后只能盡量?jī)?yōu)化代碼,減少錯(cuò)誤出現(xiàn)的幾率。

來(lái)源:http://www./content-1-170151.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多