鴻蒙OS Throwable

2022-05-31 15:06 更新

Throwable

java.lang.Object

|---java.lang.Throwable

public class Throwable
extends Object
implements Serializable

Throwable 類是 Java 語言中所有錯誤和異常的超類。只有作為此類(或其子類之一)實例的對象才會被 Java 虛擬機拋出,或者可以被 Java throw 語句拋出。同樣,只有此類或其子類之一可以是 catch 子句中的參數(shù)類型。出于對異常的編譯時檢查的目的,Throwable 和任何不是 RuntimeException 或 Error 的子類的 Throwable 子類都被視為已檢查異常。

兩個子類的實例,錯誤和異常,通常用于指示發(fā)生了異常情況。通常,這些實例是在異常情況的上下文中新創(chuàng)建的,以便包含相關(guān)信息(例如堆棧跟蹤數(shù)據(jù))。

throwable 包含其線程在創(chuàng)建時的執(zhí)行堆棧的快照。它還可以包含提供有關(guān)錯誤的更多信息的消息字符串。隨著時間的推移,一個 throwable 可以 Throwable#addSuppressed 其他 throwable 被傳播。最后,throwable 還可以包含一個原因:另一個 throwable 導致該 throwable 被構(gòu)造。這種因果信息的記錄被稱為鏈式異常設(shè)施,因為原因本身可以有一個原因,依此類推,導致異?!版湣?,每個異常都由另一個引起。

throwable 可能有原因的一個原因是拋出它的類是構(gòu)建在較低層抽象之上的,并且由于較低層中的失敗而導致上層上的操作失敗。讓下層拋出的 throwable 向外傳播是不好的設(shè)計,因為它通常與上層提供的抽象無關(guān)。此外,這樣做會將上層的 API 與其實現(xiàn)的細節(jié)聯(lián)系起來,假設(shè)下層的異常是已檢查異常。拋出“包裝異常”(即包含原因的異常)允許上層將失敗的細節(jié)傳達給其調(diào)用者,而不會產(chǎn)生這些缺點中的任何一個。它保留了更改上層實現(xiàn)的靈活性,而無需更改其 API(特別是其方法引發(fā)的異常集)。

throwable 可能有原因的第二個原因是,拋出它的方法必須符合不允許該方法直接拋出原因的通用接口。例如,假設(shè)一個持久化集合符合 Collection 接口,并且它的持久性是在 java.io 上實現(xiàn)的。假設(shè) add 方法的內(nèi)部可以拋出一個 IOException。該實現(xiàn)可以將 IOException 的詳細信息傳達給其調(diào)用者,同時通過將 IOException 包裝在適當?shù)奈唇?jīng)檢查的異常中來符合 Collection 接口。 (持久化集合的規(guī)范應(yīng)該表明它能夠拋出這樣的異常。)

原因可以通過兩種方式與 throwable 相關(guān)聯(lián):通過將原因作為參數(shù)的構(gòu)造函數(shù),或通過 initCause(java.lang.Throwable) 方法。希望允許原因與它們關(guān)聯(lián)的新 throwable 類應(yīng)提供采用原因的構(gòu)造函數(shù),并將(可能間接)委托給采用原因的 Throwable 構(gòu)造函數(shù)之一。因為 initCause 方法是公共的,它允許一個原因與任何 throwable 相關(guān)聯(lián),甚至是一個“l(fā)egacy throwable”,其實現(xiàn)早于將異常鏈接機制添加到 Throwable。

按照慣例,Throwable 類及其子類有兩個構(gòu)造函數(shù),一個不帶參數(shù),另一個帶可用于生成詳細消息的 String 參數(shù)。此外,那些可能有相關(guān)原因的子類應(yīng)該有另外兩個構(gòu)造函數(shù),一個采用 Throwable(原因),另一個采用 String(詳細消息)和 Throwable(原因)。

構(gòu)造函數(shù)摘要

修飾符 構(gòu)造函數(shù) 描述
Throwable() 構(gòu)造一個以 null 作為其詳細消息的新 throwable。
Throwable(String message) 使用指定的詳細消息構(gòu)造一個新的 throwable。
Throwable(String message, Throwable cause) 使用指定的詳細消息和原因構(gòu)造一個新的 throwable。
protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) 使用指定的詳細消息、原因、啟用或禁用抑制以及啟用或禁用可寫堆棧跟蹤構(gòu)造一個新的 throwable。
Throwable(Throwable cause) 使用指定的原因和 (cause==null ? null : cause.toString()) 的詳細消息構(gòu)造一個新的 throwable(通常包含原因的類和詳細消息)。

方法總結(jié)

修飾符和類型 方法 描述
void addSuppressed(Throwable exception) 將指定的異常附加到為傳遞此異常而被抑制的異常。
Throwable fillInStackTrace() 填寫執(zhí)行堆棧跟蹤。
Throwable getCause() 如果原因不存在或未知,則返回此 throwable 的原因或 null。
String getLocalizedMessage() 創(chuàng)建此 throwable 的本地化描述。
String getMessage() 返回此 throwable 的詳細消息字符串。
StackTraceElement[] getStackTrace() 提供對 printStackTrace() 打印的堆棧跟蹤信息的編程訪問。
Throwable[] getSuppressed() 返回一個數(shù)組,其中包含通常由 try-with-resources 語句抑制的所有異常,以傳遞此異常。
Throwable initCause(Throwable cause) 將此 throwable 的原因初始化為指定值。
void printStackTrace() 將此 throwable 及其回溯打印到標準錯誤流。
void printStackTrace(PrintStream s) 將此 throwable 及其回溯打印到指定的打印流。
void printStackTrace(PrintWriter s) 將此 throwable 及其回溯打印到指定的打印編寫器。
void setStackTrace(StackTraceElement[] stackTrace) 設(shè)置將由 getStackTrace() 返回并由 printStackTrace() 和相關(guān)方法打印的堆棧跟蹤元素。
String toString() 返回此 throwable 的簡短描述。
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

構(gòu)造函數(shù)詳細信息

Throwable

public Throwable()

構(gòu)造一個以 null 作為其詳細消息的新 throwable。 原因未初始化,隨后可能通過調(diào)用 initCause(java.lang.Throwable) 進行初始化。

調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。

Throwable

public Throwable(String message)

使用指定的詳細消息構(gòu)造一個新的 throwable。 原因未初始化,隨后可能通過調(diào)用 initCause(java.lang.Throwable) 進行初始化。

調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。

參數(shù):

參數(shù)名稱 參數(shù)描述
message 詳細信息。 詳細消息被保存以供以后通過 getMessage() 方法檢索。

Throwable

public Throwable(String message, Throwable cause)

使用指定的詳細消息和原因構(gòu)造一個新的 throwable。

請注意,與原因關(guān)聯(lián)的詳細消息不會自動合并到此 throwable 的詳細消息中。

調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。

參數(shù):

參數(shù)名稱 參數(shù)描述
message 詳細消息(保存以供以后通過 getMessage() 方法檢索)。
cause 原因(由 getCause() 方法保存以供以后檢索)。 (允許使用空值,表示原因不存在或未知。)

Throwable

public Throwable(Throwable cause)

使用指定的原因和 (cause==null ? null : cause.toString()) 的詳細消息構(gòu)造一個新的 throwable(通常包含原因的類和詳細消息)。 此構(gòu)造函數(shù)對于僅是其他 throwable 的包裝器(例如 PrivilegedActionException)的 throwable 很有用。

調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。

參數(shù):

參數(shù)名稱 參數(shù)描述
cause 原因(由 getCause() 方法保存以供以后檢索)。 (允許使用空值,表示原因不存在或未知。)

Throwable

protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)

使用指定的詳細消息、原因、啟用或禁用抑制以及啟用或禁用可寫堆棧跟蹤構(gòu)造一個新的 throwable。如果禁用了抑制,則此對象的 getSuppressed() 將返回一個長度為零的數(shù)組,并且調(diào)用 addSuppressed(java.lang.Throwable) 否則會將異常附加到抑制列表將無效。如果可寫堆棧跟蹤為 false,則此構(gòu)造函數(shù)將不會調(diào)用 fillInStackTrace(),會將 null 寫入 stackTrace 字段,隨后對 fillInStackTrace 和 [setStackTrace(java.lang.StackTraceElement]) 的調(diào)用將不會設(shè)置堆棧跟蹤。如果可寫堆棧跟蹤為假,getStackTrace() 將返回一個零長度數(shù)組。

請注意,Throwable 的其他構(gòu)造函數(shù)將抑制視為已啟用,并將堆棧跟蹤視為可寫。 Throwable 的子類應(yīng)記錄禁用抑制的任何條件以及堆棧跟蹤不可寫的條件。只有在存在特殊要求的特殊情況下才應(yīng)禁用抑制,例如虛擬機在內(nèi)存不足的情況下重用異常對象。重復(fù)捕獲和重新拋出給定異常對象的情況,例如實現(xiàn)兩個子系統(tǒng)之間的控制流,是不可變可拋出對象適用的另一種情況。

參數(shù):

參數(shù)名稱 參數(shù)描述
message 詳細信息。
cause 原因。 (允許使用空值,表示原因不存在或未知。)
enableSuppression 是否啟用或禁用抑制
writableStackTrace 堆棧跟蹤是否應(yīng)該是可寫的

方法詳情

getMessage

public String getMessage()

返回此 throwable 的詳細消息字符串。

返回:

此 Throwable 實例的詳細消息字符串(可能為 null)。

getLocalizedMessage

public String getLocalizedMessage()

創(chuàng)建此 throwable 的本地化描述。 子類可以覆蓋此方法以生成特定于語言環(huán)境的消息。 對于不覆蓋此方法的子類,默認實現(xiàn)返回與 getMessage() 相同的結(jié)果。

返回:

此 throwable 的本地化描述。

getCause

public Throwable getCause()

如果原因不存在或未知,則返回此 throwable 的原因或 null。 (原因是導致這個 throwable 被拋出的 throwable。)

此實現(xiàn)返回通過需要 Throwable 的構(gòu)造函數(shù)之一提供的原因,或者在使用 initCause(java.lang.Throwable) 方法創(chuàng)建之后設(shè)置的原因。 雖然通常不需要重寫此方法,但子類可以重寫它以返回通過其他方式設(shè)置的原因。 這適用于早于將鏈式異常添加到 Throwable 的“傳統(tǒng)鏈式 throwable”。 請注意,沒有必要重寫任何 PrintStackTrace 方法,所有這些方法都會調(diào)用 getCause 方法來確定 throwable 的原因。

返回:

如果原因不存在或未知,則返回此 throwable 的原因或 null。

initCause

public Throwable initCause(Throwable cause)

將此 throwable 的原因初始化為指定值。 (原因是導致這個 throwable 被拋出的 throwable。)

該方法最多可以調(diào)用一次。 它通常在構(gòu)造函數(shù)中調(diào)用,或者在創(chuàng)建 throwable 之后立即調(diào)用。 如果這個 throwable 是用 Throwable(java.lang.Throwable) 或 Throwable(java.lang.String,java.lang.Throwable) 創(chuàng)建的,這個方法甚至不能被調(diào)用一次。

在沒有其他設(shè)置原因的支持的情況下在遺留可拋出類型上使用此方法的示例是:

 try {
     lowLevelOp();
 } catch (LowLevelException le) {
     throw (HighLevelException)
           new HighLevelException().initCause(le); // Legacy constructor
 }

 

參數(shù):

參數(shù)名稱 參數(shù)描述
cause 原因(由 getCause() 方法保存以供以后檢索)。 (允許使用空值,表示原因不存在或未知。)

返回:

對此 Throwable 實例的引用。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果原因是可拋出的。 (一個 throwable 不能是它自己的原因。)
IllegalStateException 如果這個 throwable 是用 Throwable(java.lang.Throwable) 或 Throwable(java.lang.String,java.lang.Throwable) 創(chuàng)建的,或者這個方法已經(jīng)在這個 throwable 上調(diào)用過。

toString

public String toString()

返回此 throwable 的簡短描述。 結(jié)果是以下內(nèi)容的串聯(lián):

  • 這個對象的類的 Class#getName()
  • ":"(冒號和空格)
  • 調(diào)用此對象的 getLocalizedMessage() 方法的結(jié)果

如果 getLocalizedMessage 返回 null,則只返回類名。

覆蓋:

類 Object 中的 toString

返回:

此 throwable 的字符串表示形式。

printStackTrace

public void printStackTrace()

將此 throwable 及其回溯打印到標準錯誤流。 此方法在錯誤輸出流上打印此 Throwable 對象的堆棧跟蹤,即字段 System.err 的值。 輸出的第一行包含該對象的 toString() 方法的結(jié)果。 剩余的行表示先前由方法 fillInStackTrace() 記錄的數(shù)據(jù)。 此信息的格式取決于實現(xiàn),但以下示例可被視為典型示例:

 java.lang.NullPointerException
         at MyClass.mash(MyClass.java:9)
         at MyClass.crunch(MyClass.java:6)
         at MyClass.main(MyClass.java:3)

 

這個例子是通過運行程序產(chǎn)生的:

 class MyClass {
     public static void main(String[] args) {
         crunch(null);
     }
     static void crunch(int[] a) {
         mash(a);
     }
     static void mash(int[] b) {
         System.out.println(b[0]);
     }
 }

 

具有已初始化的非空原因的 throwable 的回溯通常應(yīng)包括原因的回溯。 此信息的格式取決于實現(xiàn),但以下示例可被視為典型示例:

 HighLevelException: MidLevelException: LowLevelException
         at Junk.a(Junk.java:13)
         at Junk.main(Junk.java:4)
 Caused by: MidLevelException: LowLevelException
         at Junk.c(Junk.java:23)
         at Junk.b(Junk.java:17)
         at Junk.a(Junk.java:11)
         ... 1 more
 Caused by: LowLevelException
         at Junk.e(Junk.java:30)
         at Junk.d(Junk.java:27)
         at Junk.c(Junk.java:21)
         ... 3 more

 

請注意包含字符“...”的行的存在。 這些行表明此異常的堆棧跟蹤的其余部分與此異常(“封閉”異常)導致的異常的堆棧跟蹤底部的指定幀數(shù)相匹配。 這種速記可以大大減少輸出的長度,在這種情況下,從與捕獲“原因異?!毕嗤姆椒⊕伋霭b異常的常見情況。 上面的例子是通過運行程序產(chǎn)生的:

 public class Junk {
     public static void main(String args[]) {
         try {
             a();
         } catch(HighLevelException e) {
             e.printStackTrace();
         }
     }
     static void a() throws HighLevelException {
         try {
             b();
         } catch(MidLevelException e) {
             throw new HighLevelException(e);
         }
     }
     static void b() throws MidLevelException {
         c();
     }
     static void c() throws MidLevelException {
         try {
             d();
         } catch(LowLevelException e) {
             throw new MidLevelException(e);
         }
     }
     static void d() throws LowLevelException {
        e();
     }
     static void e() throws LowLevelException {
         throw new LowLevelException();
     }
 }


 class HighLevelException extends Exception {
     HighLevelException(Throwable cause) { super(cause); }
 }


 class MidLevelException extends Exception {
     MidLevelException(Throwable cause)  { super(cause); }
 }


 class LowLevelException extends Exception {
 }

 

從版本 7 開始,平臺支持抑制異常的概念(與 try-with-resources 語句一起使用)。 為了傳遞異常而被抑制的任何異常都將打印在堆棧跟蹤下方。 此信息的格式取決于實現(xiàn),但以下示例可被視為典型示例:

 Exception in thread "main" java.lang.Exception: Something happened
  at Foo.bar(Foo.java:10)
  at Foo.main(Foo.java:5)
  Suppressed: Resource$CloseFailException: Resource ID = 0
          at Resource.close(Resource.java:26)
          at Foo.bar(Foo.java:9)
          ... 1 more

 

請注意,“... n more”符號用于抑制異常,就像它用于原因一樣。 與原因不同,被抑制的異常在其“包含異?!敝饪s進。

一個異??梢杂幸粋€原因和一個或多個被抑制的異常:

 Exception in thread "main" java.lang.Exception: Main block
  at Foo3.main(Foo3.java:7)
  Suppressed: Resource$CloseFailException: Resource ID = 2
          at Resource.close(Resource.java:26)
          at Foo3.main(Foo3.java:5)
  Suppressed: Resource$CloseFailException: Resource ID = 1
          at Resource.close(Resource.java:26)
          at Foo3.main(Foo3.java:5)
 Caused by: java.lang.Exception: I did it
  at Foo3.main(Foo3.java:8)

 

同樣,抑制的異??赡苡性颍?/p>

 Exception in thread "main" java.lang.Exception: Main block
  at Foo4.main(Foo4.java:6)
  Suppressed: Resource2$CloseFailException: Resource ID = 1
          at Resource2.close(Resource2.java:20)
          at Foo4.main(Foo4.java:5)
  Caused by: java.lang.Exception: Rats, you caught me
          at Resource2$CloseFailException.<init>(Resource2.java:45)
          ... 2 more

 

printStackTrace

public void printStackTrace(PrintStream s)

將此 throwable 及其回溯打印到指定的打印流。

參數(shù):

參數(shù)名稱 參數(shù)描述
s 用于輸出的 PrintStream

printStackTrace

public void printStackTrace(PrintWriter s)

將此 throwable 及其回溯打印到指定的打印編寫器。

參數(shù):

參數(shù)名稱 參數(shù)描述
s PrintWriter 用于輸出

fillInStackTrace

public Throwable fillInStackTrace()

填寫執(zhí)行堆棧跟蹤。 此方法在此 Throwable 對象中記錄有關(guān)當前線程的堆棧幀的當前狀態(tài)的信息。

如果這個 Throwable Throwable#Throwable(String, Throwable, boolean, boolean) 的堆棧跟蹤,調(diào)用這個方法是沒有效果的。

返回:

對此 Throwable 實例的引用。

getStackTrace

public StackTraceElement[] getStackTrace()

提供對 printStackTrace() 打印的堆棧跟蹤信息的編程訪問。返回堆棧跟蹤元素的數(shù)組,每個元素代表一個堆棧幀。數(shù)組的第零個元素(假設(shè)數(shù)組的長度不為零)表示堆棧的頂部,這是序列中的最后一個方法調(diào)用。通常,這是這個 throwable 被創(chuàng)建和拋出的點。數(shù)組的最后一個元素(假設(shè)數(shù)組的長度不為零)表示堆棧的底部,這是序列中的第一個方法調(diào)用。

在某些情況下,某些虛擬機可能會從堆棧跟蹤中省略一個或多個堆棧幀。在極端情況下,允許沒有關(guān)于這個 throwable 的堆棧跟蹤信息的虛擬機從這個方法返回一個長度為零的數(shù)組。一般來說,此方法返回的數(shù)組將為 printStackTrace 打印的每一幀包含一個元素。寫入返回的數(shù)組不會影響以后對該方法的調(diào)用。

返回:

堆棧跟蹤元素數(shù)組,表示與此 throwable 相關(guān)的堆棧跟蹤。

setStackTrace

public void setStackTrace(StackTraceElement[] stackTrace)

設(shè)置將由 getStackTrace() 返回并由 printStackTrace() 和相關(guān)方法打印的堆棧跟蹤元素。 此方法專為 RPC 框架和其他高級系統(tǒng)使用而設(shè)計,允許客戶端覆蓋默認堆棧跟蹤,該堆棧跟蹤要么在構(gòu)造 throwable 時由 fillInStackTrace() 生成,要么在從序列化流中讀取 throwable 時反序列化。

如果此 Throwable Throwable#Throwable(String, Throwable, boolean, boolean) 的堆棧跟蹤,則調(diào)用此方法除了驗證其參數(shù)外沒有任何效果。

參數(shù):

參數(shù)名稱 參數(shù)描述
stackTrace 要與此 Throwable 關(guān)聯(lián)的堆棧跟蹤元素。 此調(diào)用復(fù)制指定的數(shù)組; 方法調(diào)用返回后對指定數(shù)組的更改不會影響此 Throwable 的堆棧跟蹤。

Throws:

Throw名稱 Throw描述
NullPointerException 如果 stackTrace 為 null 或 stackTrace 的任何元素為 null

addSuppressed

public final void addSuppressed(Throwable exception)

將指定的異常附加到為傳遞此異常而被抑制的異常。此方法是線程安全的,通常由 try-with-resources 語句調(diào)用(自動和隱式)。

除非通過構(gòu)造函數(shù)禁用,否則會啟用抑制行為。當抑制被禁用時,這個方法除了驗證它的參數(shù)之外什么都不做。

請注意,當一個異常導致另一個異常時,通常會捕獲第一個異常,然后拋出第二個異常作為響應(yīng)。換句話說,這兩個例外之間存在因果關(guān)系。相反,在某些情況下,可以在同級代碼塊中引發(fā)兩個獨立的異常,特別是在 try-with-resources 語句的 try 塊和關(guān)閉資源的編譯器生成的 finally 塊中。在這些情況下,只能傳播引發(fā)的異常之一。在 try-with-resources 語句中,當有兩個這樣的異常時,將傳播源自 try 塊的異常,并將 finally 塊的異常添加到由 try 塊的異常抑制的異常列表中。當一個異常展開堆棧時,它可以累積多個被抑制的異常。

一個異??赡芤呀?jīng)抑制了異常,同時也由另一個異常引起。異常是否有原因在其創(chuàng)建時在語義上是已知的,這與異常是否會抑制其他異常不同,這通常僅在拋出異常后才確定。

請注意,程序員編寫的代碼也能夠在存在多個同級異常且只能傳播一個異常的情況下調(diào)用此方法。

參數(shù):

參數(shù)名稱 參數(shù)描述
exception 要添加到抑制異常列表中的異常

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果異常是可拋出的; throwable 無法抑制自身。
NullPointerException 如果異常為null

getSuppressed

public final Throwable[] getSuppressed()

返回一個數(shù)組,其中包含通常由 try-with-resources 語句抑制的所有異常,以傳遞此異常。 如果沒有抑制異?;蚪靡种?,則返回一個空數(shù)組。 此方法是線程安全的。 寫入返回的數(shù)組不會影響以后對該方法的調(diào)用。

返回:

一個數(shù)組,其中包含為傳遞此異常而被抑制的所有異常。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號