異常---Day21(寫得有錯請指出,感謝)

来源:https://www.cnblogs.com/hpcz190911/archive/2019/11/13/11846366.html
-Advertisement-
Play Games

異常的概念 異常,就是不正常的意思。在生活中:醫生說,你的身體某個部位有異常,該部位和正常相比有點不同,該部位的功能將受影響.在程式中的意思就是:指的是程式在執行過程中,出現的非正常的情況,終會導致JVM的非正常停止 註意:在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是創建異常對象 ...


異常的概念

  異常,就是不正常的意思。在生活中:醫生說,你的身體某個部位有異常,該部位和正常相比有點不同,該部位的功能將受影響.在程式中的意思就是:指的是程式在執行過程中,出現的非正常的情況,終會導致JVM的非正常停止

  註意:在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是創建異常對象並拋出了一個異常對象。Java處理異常的方式是中斷處理、異常指的並不是語法錯誤,語法錯了,編譯不通過,不會產生位元組碼文件,根本不能運行.

異常體系

  異常機制其實是幫助我們找到程式中的問題,異常的根類是 java.lang.Throwable ,其下有兩個子類: java.lang.Error 與 java.lang.Exception ,平常所說的異常指 java.lang.Exception 

  

Throwable體系

  Error:嚴重錯誤Error,無法通過處理的錯誤,只能事先避免,好比絕症。

  Exception:表示異常,異常產生後程式員可以通過代碼的方式糾正,使程式繼續運行,是必須要處理的。比如感冒、闌尾炎

Throwable中的常用方法

  public void printStackTrace() :列印異常的詳細信息。 包含了異常的類型,異常的原因,還包括異常出現的位置,在開發和調試階段,都得使用printStackTrace。 

  public String getMessage() :獲取發生異常的原因。 提示給用戶的時候,就提示錯誤原因。 

  public String toString() :獲取異常的類型和異常描述信息(不用)。

異常(我們平常所說的異常就是Exception)的分類

  編譯時期異常:checked異常。在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常) 

  運行時期異常:runtime異常。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數學異常)

  

異常的處理

   Java異常處理的五個關鍵字:try、catch、finally、throw、throws

   拋出異常throw 

    在java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象

      1. 創建一個異常對象。封裝一些提示信息(信息可以自己編寫)。

      2. 需要將這個異常對象告知給調用者。怎麼告知呢?怎麼將這個異常對象傳遞到調用者處呢?通過關鍵字throw 就可以完成。throw 異常對象。

        throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行

    使用格式:throw new 異常類名(參數);

 1 package demosummary.exception;
 2 
 3 public class ThrowDemo {
 4     public static void main(String[] args) {
 5         //創建數組
 6         int[] arr = {2, 4, 6, 8};
 7         //根據索引找元素
 8         int index = 4;
 9         int element = getElement(arr, index);
10         System.out.println(element);
11         System.out.println( "over");
12     }
13 
14     /*
15         根據索引找到元素
16      */
17     private static int getElement(int[] arr, int index) {
18         //判斷是否索引越界異常
19         if (index < 0 || index > arr.length - 1) {
20             /*判斷條件如果滿足,當執行完throw拋出異常對象後,方法已經無法繼續運算           
21             這時就會結束當前方法的執行,並將異常告知給調用者。這時就需要通過異常來解決
22             */
23             throw new ArrayIndexOutOfBoundsException("哥們,角標越界了~~~");
24         }
25         int element = arr[index];
26         return element;
27     }
28 }

Objects非空判斷 

  public static <T> T requireNonNull(T obj) :查看指定引用對象不是null

 1 package demosummary.exception;
 2 
 3 public class Objects非空判斷 {
 4     public static void main(String[] args) {
 5         Integer a = null;
       //調用方法reqireNonNull
6 requireNonNull(a); 7 } 8 9 public static <T> T requireNonNull(T obj) { 10 //判斷是否為空 11 if (obj == null) { 12 throw new NullPointerException(); 13 } 14 return obj; 15 } 16 17 /** 18 * 執行結果 19 * Exception in thread "main" java.lang.NullPointerException 20 * at demosummary.exception.Objects非空判斷.requireNonNull(Objects非空判斷.java:11) 21 * at demosummary.exception.Objects非空判斷.main(Objects非空判斷.java:6) 22 */ 23 }

聲明異常throws 

  聲明異常:將問題標識出來,報告給調用者。如果方法內通過throw拋出了編譯時異常,而沒有捕獲處理(稍後講 解該方式),那麼必須通過throws進行聲明,讓調用者去處理。   

  關鍵字throws運用於方法聲明之上,用於表示當前方法不處理異常,而是提醒該方法的調用者來處理異常(拋出異常).

  格式:修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2…{   }

 1 package demosummary.exception;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.IOException;
 5 
 6 public class ThrowsDemo {
 7     public static void main(String[] args) throws IOException {
 8         read("a.txt");
 9     }
10 
11     public static void read(String path) throws FileNotFoundException,IOException{
12         if (!path.equals("a.txt")) {
13             /*
14                 如果不是a.txt這個文件,則認為該文件不存在,是一個錯誤,也就是一個異常 throw
15              */
16             throw new FileNotFoundException("文件不存在");
17         }
18         if (!path.equals("b.txt")) {
19             throw new IOException();
20         }
21     }
22 }

捕獲異常try…catch 

  如果異常出現的話,會立刻終止程式,所以我們得處理異常:

    1. 該方法不處理,而是聲明拋出,由該方法的調用者來處理(throws)。

    2. 在方法中使用try-catch的語句塊來處理異常。

  try-catch的方式就是捕獲異常。  

    捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理。

    格式:

      try{     

        編寫可能會出現異常的代碼

      }catch(異常類型  e){     

        處理異常的代碼     

        //記錄日誌/列印異常信息/繼續拋出異常

      }

    try:該代碼塊中編寫可能產生異常的代碼。 

    catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理

    註意:try和catch都不能單獨使用,必須連用

 1 package demosummary.exception;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.IOException;
 5 
 6 public class ThrowsDemo {
 7     public static void main(String[] args) {
 8         //當有異常產生時,我們必須要處理,要麼聲明,要麼捕獲
 9         try {
10             read("a.txt");
11         } catch (FileNotFoundException e) {
12             //try中拋出什麼異常,在括弧中就定義什麼異常類型
13             e.printStackTrace();
14         }
15         System.out.println("over");
16     }
17 
18     public static void read(String path) throws FileNotFoundException{
19         if (!path.equals("a.txt")) {
20             /*
21                 如果不是a.txt這個文件,則認為該文件不存在,是一個錯誤,也就是一個異常 throw
22              */
23             throw new FileNotFoundException("文件不存在");
24         }
25     }
26 }

    public String getMessage() :獲取異常的描述信息,原因(提示給用戶的時候,就提示錯誤原因。

    public String toString() :獲取異常的類型和異常描述信息(不用)。

    public void printStackTrace() :列印異常的跟蹤棧信息並輸出到控制台。

finally 代碼塊 

  finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程式跳轉,導致有些語句執行 不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。

  finally的語法: try...catch....finally:自身需要處理異常,終還得關閉資源。(註意:finally不能單獨使用)

 1 package demosummary.exception;
 2 
 3 import java.io.FileNotFoundException;
 4 
 5 public class TryCatchFinally異常處理 {
 6     public static void main(String[] args) {
 7         //當有異常產生時,我們必須要處理,要麼聲明,要麼捕獲
 8         try {
 9             read("a.txt");
10         } catch (FileNotFoundException e) {
11             //try中拋出什麼異常,在括弧中就定義什麼異常類型
12             e.printStackTrace();
13         }finally {
14             System.out.println("不管程式怎樣,這裡都將會被執行。");
15         }
16             System.out.println("over");
17     }
18 
19     public static void read(String path) throws FileNotFoundException{
20         if (!path.equals("a.txt")) {
21             /*
22                 如果不是a.txt這個文件,則認為該文件不存在,是一個錯誤,也就是一個異常 throw
23              */
24             throw new FileNotFoundException("文件不存在");
25         }
26     }
27 }

    當只有在try或者catch中調用退出JVM的相關方法,此時finally才不會執行,否則finally永遠會執行。

異常註意事項

  多個異常使用捕獲又該如何處理呢?

    1. 多個異常分別處理。

    2. 多個異常一次捕獲,多次處理。

    3. 多個異常一次捕獲一次處理。 

  一般我們是使用一次捕獲多次處理方式,格式如下:

    try{     

      編寫可能會出現異常的代碼

    }catch(異常類型A  e){ 當try中出現A類型異常,就用該catch來捕獲.     

      處理異常的代碼     

      //記錄日誌/列印異常信息/繼續拋出異常

    }catch(異常類型B  e){  當try中出現B類型異常,就用該catch來捕獲.     

      處理異常的代碼     

      //記錄日誌/列印異常信息/繼續拋出異常

    }

    註意:這種異常處理方式,要求多個catch中的異常不能相同,並且若catch中的多個異常之間有子父類異 常的關係,那麼子類異常要求在上面的catch處理,父類異常在下麵的catch處理。

  運行時異常被拋出可以不處理。即不捕獲也不聲明拋出。

  如果finally有return語句,永遠返回finally中的結果,避免該情況.

  如果父類拋出了多個異常,子類重寫父類方法時,拋出和父類相同的異常或者是父類異常的子類或者不拋出異 常。

  父類方法沒有拋出異常,子類重寫父類該方法時也不可拋出異常。此時子類產生該異常,只能捕獲處理,不能聲明拋出 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 閉包的實現原理和作用 1、閉包的概念:指有權訪問另一個函數作用域中的變數的函數,一般情況就是在一個函數中包含另一個函數。 2、閉包的作用:訪問函數內部變數、保持函數在環境中一直存在,不會被垃圾回收機制處理 因為函數內部聲明 的變數是局部的,只能在函數內部訪問到,但是函數外部的變數是對函數內部可見的, ...
  • 讀取數據://ajax去伺服器端校驗$.ajax({ type:"post", url:"http://", data:{deviceid:1}, dataType:'json', success : function(data) { var jsonText = data; var ab= eva ...
  • 通過日常的工作記錄NPM常用命令,不斷的學習,不斷總結,未完待續…… ...
  • 場景 Nginx入門簡介和反向代理、負載均衡、動靜分離理解: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ubuntu Server 16.04 LTS上怎樣安裝下載安裝Nginx並啟動: https://b ...
  • Eureka作為服務註冊與發現的組件,Eureka2.0已經閉源了,但是本教程還是以Eureka為核心進行展開。 1、三個模塊 Spring Cloud Eureka是Spring Cloud Netflix微服務套件之一,基於Netflix Eureka做了二次封裝,主要負責完成微服務架構中的服務 ...
  • windows安裝python flask虛擬環境: 安裝虛擬環境主要是為了防止不同python版本之間衝突的問題,虛擬環境安裝的包包不會對外部真實環境產生任何作用,只會作用於虛擬環境。這樣,一個flask框架應用對應一個虛擬環境,虛擬環境不會幹擾外部真實環境,同時也不會受外部環境干擾。 1、安裝v ...
  • 以思維導圖的方式呈現: 鏈接: https://naotu.baidu.com/file/9b3e739442ffb9f5bc5c3cee2b1a3489 png圖片: 作者:流浪者 日期:2019-11-13 ...
  • Nginx 進程結構 這篇文章我們來看下 Nginx 的進程結構,Nginx 其實有兩種進程結構: 單進程結構 多進程結構 單進程結構實際上不適用於生產環境,只適合我們做開發調試使用。因為在生產環境中我們必須保持 Nginx 足夠健壯以及 Nginx 可以利用多核的一個特性,而單進程的 Nginx ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...