中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java的異常機制是什么

發布時間:2021-07-12 11:39:28 來源:億速云 閱讀:152 作者:chen 欄目:編程語言

本篇內容介紹了“Java的異常機制是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

java異常指在程序運行時可能出現的一些錯誤,如:文件找不到、網絡連接失敗、非法參數等。異常是一個事件,它發生在程序運行期間,中斷了正在執行的程序的正常指令流。

Java通過API中Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是對象,是Throwable子類的實例,描述了出現在一段編碼中的錯誤條件。當條件生成時,錯誤將引發異常。對于運行時異常、錯誤或可查異常,Java技術所要求的異常處理方式有所不同。
異常體系分類

Q: Throwable 和 Error的關系
A: Throwable是Error(錯誤)的基類,也是Exception的基類
1個好圖,可看到常見的異常和error
 

Java的異常機制是什么

Q: Error和Exception的關系
A:

    Error一般是會直接引起jvm出錯的錯誤,例如Java虛擬機運行錯誤等,如果出現了當前線程會無法繼續運行。
    Excpetion是程序本身可以處理的異常。發生后還能正常運行。

Q: Error可以被catch捕捉嗎?
A: 只要是Throwable和其子類都是可以throw和catch的。 但是不建議捕捉Error。

異常體系還可以分為這2類:

    unchecked exception(非檢查異常)
    也稱運行時異常(RuntimeException),比如常見的NullPointerException、IndexOutOfBoundsException。對于運行時異常,java編譯器不要求必須進行異常捕獲處理或者拋出聲明,由程序員自行決定。
    checked exception(檢查異常,編譯異常)
    也稱非運行時異常(運行時異常以外的異常就是非運行時異常),java編譯器強制程序員必須進行捕獲處理,比如常見的IOExeption和SQLException。對于非運行時異常如果不進行捕獲或者拋出聲明處理,編譯都不會通過。

異常捕捉和返回

Q: return-finally陷阱1: finally能通過修改變量,來更新return的變量值嗎

    int f() {
      int a = 1;
      try {
          return a;
      }
      finally {
          a=2;
      }
    }

A: 不能, f返回1。

Q: return-finally陷阱2: finally里也return時,返回哪個?

    int f() {
      try {
          return 1;
      }
      finally {
          return 2;
      }
    }

A:返回finally里的,返回2。

Q: 什么情況下finally塊里的步驟可以不執行?
A: 只有在finally之前調用System.exit(0)退出jvm, 才能讓finally不執行。

Q: 下面會發生什么?

    try {
        start();
    } catch (Exception ex) {
        System.out.println("catch Exception");
    } catch (RuntimeException re) {
        System.out.println("catch RuntimeException");
    }

A: 直接編譯就錯誤了。 catch是會按順序的且匹配1個就不再往下匹配,編譯器因此識別出RuntimeExcpetion永遠不會被捕捉到,便提前報錯。

Q:throw異常的時候,在finally中做return,那么異常還會拋出嗎?

    static int f() {
        try {
            int a = 1/0;
            return a;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            return -1;
        }
    }
    public static void main(String[] args) {
        System.out.println(f());
    }

A:不會,返回-1.

即finaly中做return會中斷throw
因此永遠不要在finally中去做return操作
受檢異常相關問題

Q: 子類覆寫基類方法時 , 能throws基類方法中不存在的異常嗎?
像下面這樣:

    class A{
        void f() throws IOException{
        }
    }
    class B extends A{
        void f() throws IOException, SQLException {
        }
    }

A: 不行,直接編譯報錯。 即子類覆寫父類方法時, throws關鍵字后面跟的異常必須是小于等于父類方法異常的。

Java的異常機制是什么

Q: finally中調用某資源的close時,也會拋出受檢異常, 除了在finally里做try-catch,還能怎么做?

像下面這樣,finally又有catch,就很難看:

    TryWithResource tryWithResource = new TryWithResource();
            try {
                System.out.println(tryWithResource.age);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    tryWithResource.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

A:如果是JDK1.7,可以用try-with-resource語法。

需要資源類實現AutoCloseable接口, 并在try的時候在try括號后面跟上資源的創建,如下:

        public static void main(String[] args) {
            try (TryWithResource tryWithResource = new TryWithResource()) {
                System.out.println(tryWithResource.age);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

這樣就不需要寫finally,finally+close會通過編譯器給我們自動加上。

Q: 線程拋出異常的話該怎么捕捉?

A: 實現異常處理接口MyUnchecckedExceptionhandler

    public class MyUnchecckedExceptionhandler implements UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("捕獲異常處理方法:" + e);
        }
    }

然后把實現類設置給對應線程。

    Thread t = new Thread(new ExceptionThread());
    t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
    t.start();
 

“Java的異常機制是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

繁昌县| 军事| 丹巴县| 定州市| 大庆市| 泰宁县| 建宁县| 广德县| 长宁区| 和龙市| 庄河市| 永城市| 台南县| 东山县| 永川市| 台中县| 浙江省| 竹溪县| 丹寨县| 湾仔区| 教育| 翁牛特旗| 浦江县| 阿巴嘎旗| 新昌县| 鸡西市| 望江县| 兴隆县| 乌审旗| 深水埗区| 洛隆县| 北碚区| 阳新县| 乌兰察布市| 和静县| 博爱县| 怀安县| 上蔡县| 新河县| 广丰县| 中西区|