throw 與 throws的區別,聲明異常 與 拋出異常

2020-12-17 代碼說婧語

Java 的異常處理模型基於以下三種操作:

聲明一個異常(declaring an exception)拋出一個異常(throwing an exception)捕獲一個異常(catching an exception)聲明異常

每個方法都必須聲明它可能拋出的必檢異常的類型,這稱為聲明異常(declaring exception)

不要求在方法中顯式聲明 Error 和RuntimeException (免檢異常)但是,方法要拋出的其他異常都必須在方法頭中顯式聲明,這樣,方法的調用者會被告知有異常。

為了在方法中聲明一個異常,需要在方法頭中使用關鍵字 throws,例如:publicvoidmyMethod( )throws IOException {// 方法體}//關鍵字 throws 表明 myMethod 方法可能會拋出異常 IOException//如果方法可能會拋出多個異常, 就可以在關鍵字 throws 後添加一個用逗號分隔的異常列表:public void myMethod()throws Exceptionl, Exception2, … , ExceptionN

聲明異常也是方法籤名的一部分。因此,在繼承類並重寫父類的方法時,對子類方法的聲明異常部分也有嚴格的要求

如果父類的方法沒有聲明某種類型異常,那麼在子類中重寫該方法時也不能增加聲明這種類型的異常。也就是說,子類方法聲明異常的範圍不能超過父類方法聲明的異常範圍拋出異常

檢測到錯誤的程序可以創建一個合適的異常類型的實例並拋出它, 這就稱為拋出一個異常(throwing an exception)。

如:

某個程序發現傳遞給方法的參數與方法參數的要求不符(例如,方法中的參數必須是非負的,但是傳入的是一個負參數), 這個程序就可以創建 IllegalArgumentException的一個實例並拋出它

IllegalArgumentException ex =new IllegalArgumentException("參數錯誤");throw ex;

或者使用下面的語句:

thrownew IllegalArgumentException("參數錯誤");

一般情況下,Java API 中的每個異常類都至少包含兩個構造方法:

一個無參構造方法一個帶 String 類型參數的構造方法

該String類型的參數稱為異常消息(exception message),可以調用getMessage()方法來獲取該消息。

關於throws 與 throwthrows 關鍵字用於聲明異常,其位置是方法頭部的最後,方法體開始的 { 之前throw 關鍵字則用來拋出異常,其位置是方法體中throw和throws關鍵字之間的聯繫如果在某方法中使用throw拋出了某種 unchecked exception而該throw語句並未使用 try-catch結構進行異常處理則throw語句所在的方法必須使用throws關鍵字進行該異常類的聲明,否則產生編譯錯誤。需要注意的是:

採用 throw關鍵字拋出異常之後本次方法的調用即告結束,程序的流程直接返回到本次方法的調用者那裡。儘管被調用的方法代碼可能並沒有全部執行,也沒有執行return語句。這與try塊中的代碼產生異常之後,直接運行相應的catch塊,流程的轉移方面二者是類似的。

相關焦點

  • 跟我學java編程—使用throw和throws 引發異常
    下面通過示例演示throws的用法,代碼如下:如果方法聲明後有throw語句,則在此方法被調用時,需要在調用方法中用try和catch進行異常捕獲,如果不捕獲異常,則需要在調用方法中使用throws語句將異常拋出。
  • JAVA異常及其異常處理方式
    比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(100/0),那麼你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
  • Java程式設計師必備:異常的十個關鍵知識點
    當前的執行路徑被終止,並且從當前環境中彈出對異常對象的引用。這時候異常處理程序,使程序從錯誤狀態恢復,使程序繼續運行下去。異常處理主要有拋出異常、捕獲異常、聲明異常。聲明拋出異常除了 try...catch...捕獲異常,我們還可以通過throws聲明拋出異常。當你定義了一個方法時,可以用 throws關鍵字聲明。使用了 throws關鍵字表明,該方法不處理異常,而是把異常留給它的調用者處理。是不是覺得TA不負責任?//該方法通過throws聲明了IO異常。
  • Java異常面試問題
    java異常處理中使用了四個關鍵字。throw:有時我們明確要創建異常對象然後拋出它來停止程序的正常處理。throw關鍵字用於向運行時拋出異常來處理它。throws:當我們在方法中拋出任何已檢查的異常而不處理它時,我們需要在方法籤名中使用throws關鍵字讓調用者程序知道該方法可能拋出的異常。調用方法可以處理這些異常或使用throws關鍵字將其傳播給它的調用方法。我們可以在throws子句中提供多個異常,也可以與main()方法一起使用。try-catch:我們在代碼中使用try-catch塊進行異常處理。
  • 「007期」JavaSE面試題(七):異常
    Q:throw 和 throws 的區別?throw:throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。throw 是具體向外拋出異常的動作,所以它拋出的是一個異常實例,執行 throw 一定是拋出了某種異常。
  • Java異常出現如何處理
    對於方法運行中出現的錯誤,當運行方法不預捕捉時,Java允許該方法不做任何拋出聲明。而對於所有的檢查異常,Java規定當一個方法選擇不捕捉檢查異常時,就必須聲明將拋出異常。Java異常處理主要是五個關鍵詞,分別是:try、catch、finally、throw、throws。
  • Java 中的異常和處理詳解
    檢查異常(checked exception):除了Error 和 RuntimeException的其它異常。javac強制要求程式設計師為這樣的異常做預備處理工作(使用try…catch…finally或者throws)。在方法中要麼用try-catch語句捕獲它並處理,要麼用throws子句聲明拋出它,否則編譯不會通過。這樣的異常一般是由程序的運行環境導致的。
  • Java 異常處理的 10 個良心建議!
    五、捕獲異常與拋出異常必須是完全匹配,或者捕獲異常是拋異常的父類//BizException 是 Exception 的子類public class BizException extends Exception {}//拋出父類Exceptionpublic static void test() throws Exception {}try { test
  • 面試重災區:Java的異常體系怎麼解?
    Java的異常體系結構Java異常體系的根類是 Throwable, 所以當寫在java代碼中寫throw拋出異常時,後面跟的對象必然是Throwable或其子類的對象。其中Exception異常是指一些可以恢復的異常, 例如常見的NullPointerException空指針異常。
  • 處理Java異常的10個最佳實踐
    在需要的地方聲明特定的受檢異常 public void foo() throws Exception { //錯誤做法  }一定要儘量避免上面的代碼,因為他的調用者完全不知道錯誤的原因到底是什麼。在方法聲明中,可以由方法拋出一些特定受檢異常。如果有多個,那就分別拋出多個,這樣這個方法的使用者才會分別針對每個異常做特定的處理,從而避免發生故障。
  • 【編碼】C++異常處理 - try,catch,throw,finally的用法
    對象從函數的調用處傳遞到函數參數裡與從異常拋出點傳遞到catch子句裡所採用的方法不同,這只是參數傳遞與異常傳遞的區別的一個方面,第二個差異是在函數調用者或拋出異常者與被調用者或異常捕獲者之間的類型匹配的過程不同.
  • 最常見的10種Java異常問題!
    前言本文總結了有關Java異常的十大常見問題。目錄檢查型異常(checked) vs. 非檢查型異常(Unchecked)為什麼在try代碼塊中聲明的變量不能在catch或者finally中被引用?為什麼 Double.parseDouble(null) 和 Integer.parseInt(null) 拋出的異常不一樣呢?
  • 面試須知(8):C#的異常處理機制(try...catch...finally)
    catch:程序通過異常處理程序捕獲異常。catch 關鍵字表示異常的捕獲。finally:finally 塊用於執行給定的語句,不管異常是否被拋出都會執行。例如,如果您打開一個文件,不管是否出現異常文件都要被關閉。
  • Java異常的十大問題總結
    本文總結了有關Java異常的十大常見問題。1.已檢查與未檢查簡而言之,必須在方法中顯式捕獲已檢查的異常或在方法的throws子句中聲明該異常。未檢查的異常是由無法解決的問題引起的,例如被零除,空指針等。
  • Java 異常處理的誤區和經驗總結
    我們經常將代碼分 Service、Business Logic、DAO 等不同的層次結構,DAO 層中會包含拋出異常的方法,如清單 2 所示:清單 2public Customer retrieveCustomerById(Long id) throw SQLException { //根據 ID 查詢資料庫}
  • 小白也能看懂的 Java 異常處理
    將要被監聽的代碼(可能拋出異常的代碼)放在try語句塊之內,當try語句塊內發生異常時,異常就被拋出。catch-- 用於捕獲異常。catch用來捕獲try語句塊中發生的異常。finally-- finally語句塊總是會被執行。它主要用於回收在try塊裡打開的物力資源(如資料庫連接、網絡連接和磁碟文件)。
  • junit5如何斷言已經被捕獲異常?
    前置:外部方法無法捕獲內部方法中已經被catch的異常(屏蔽catch後又throw異常的場景)junit測試框架場景2是本文重點場景1:如果方法中throw一個異常,沒有catch:public static Integer convertToInt(String str) {
  • 面試官:Exception與Error的區別?
    2、除了上面的 Exception 和 Error 的簡單區別,對於所有的檢查異常,Java規定:一個方法必須捕捉,或者聲明拋出方法之外。也就是說,當一個方法選擇不捕捉檢查異常時,它必須聲明將拋出異常。Java異常處理涉及到五個關鍵字,分別是:try、catch、finally、throw、throws。下面將驟一介紹,通過認識這五個關鍵字,掌握基本異常處理知識。try — 用於監聽。
  • 【007期】JavaSE面試題(七):異常
    Exception(異常):表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程序恢復運行,而不應該隨意終止異常。寫出你最常見的 5 個 RuntimeException?
  • Java之throw關鍵字的簡單介紹
    Java之異常產生過程解析,這次小編要介紹的是throw關鍵字,這個關鍵字可以在指定的方法中拋出指定的異常。throw關鍵字後邊new的對象必須是Exception或者Exception的子類對象。throw關鍵字拋出指定異常對象,我們就必須處理這個異常對象。