W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
java.lang.Object
|---java.lang.Throwable
public class Throwable
extends Object
implements Serializable
Throwable 類是 Java 語言中所有錯誤和異常的超類。只有作為此類(或其子類之一)實(shí)例的對象才會被 Java 虛擬機(jī)拋出,或者可以被 Java throw 語句拋出。同樣,只有此類或其子類之一可以是 catch 子句中的參數(shù)類型。出于對異常的編譯時檢查的目的,Throwable 和任何不是 RuntimeException 或 Error 的子類的 Throwable 子類都被視為已檢查異常。
兩個子類的實(shí)例,錯誤和異常,通常用于指示發(fā)生了異常情況。通常,這些實(shí)例是在異常情況的上下文中新創(chuàng)建的,以便包含相關(guān)信息(例如堆棧跟蹤數(shù)據(jù))。
throwable 包含其線程在創(chuàng)建時的執(zhí)行堆棧的快照。它還可以包含提供有關(guān)錯誤的更多信息的消息字符串。隨著時間的推移,一個 throwable 可以 Throwable#addSuppressed 其他 throwable 被傳播。最后,throwable 還可以包含一個原因:另一個 throwable 導(dǎo)致該 throwable 被構(gòu)造。這種因果信息的記錄被稱為鏈?zhǔn)疆惓TO(shè)施,因?yàn)樵虮旧砜梢杂幸粋€原因,依此類推,導(dǎo)致異?!版湣保總€異常都由另一個引起。
throwable 可能有原因的一個原因是拋出它的類是構(gòu)建在較低層抽象之上的,并且由于較低層中的失敗而導(dǎo)致上層上的操作失敗。讓下層拋出的 throwable 向外傳播是不好的設(shè)計,因?yàn)樗ǔEc上層提供的抽象無關(guān)。此外,這樣做會將上層的 API 與其實(shí)現(xiàn)的細(xì)節(jié)聯(lián)系起來,假設(shè)下層的異常是已檢查異常。拋出“包裝異常”(即包含原因的異常)允許上層將失敗的細(xì)節(jié)傳達(dá)給其調(diào)用者,而不會產(chǎn)生這些缺點(diǎn)中的任何一個。它保留了更改上層實(shí)現(xiàn)的靈活性,而無需更改其 API(特別是其方法引發(fā)的異常集)。
throwable 可能有原因的第二個原因是,拋出它的方法必須符合不允許該方法直接拋出原因的通用接口。例如,假設(shè)一個持久化集合符合 Collection 接口,并且它的持久性是在 java.io 上實(shí)現(xiàn)的。假設(shè) add 方法的內(nèi)部可以拋出一個 IOException。該實(shí)現(xiàn)可以將 IOException 的詳細(xì)信息傳達(dá)給其調(diào)用者,同時通過將 IOException 包裝在適當(dāng)?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ù)之一。因?yàn)?initCause 方法是公共的,它允許一個原因與任何 throwable 相關(guān)聯(lián),甚至是一個“l(fā)egacy throwable”,其實(shí)現(xiàn)早于將異常鏈接機(jī)制添加到 Throwable。
按照慣例,Throwable 類及其子類有兩個構(gòu)造函數(shù),一個不帶參數(shù),另一個帶可用于生成詳細(xì)消息的 String 參數(shù)。此外,那些可能有相關(guān)原因的子類應(yīng)該有另外兩個構(gòu)造函數(shù),一個采用 Throwable(原因),另一個采用 String(詳細(xì)消息)和 Throwable(原因)。
修飾符 | 構(gòu)造函數(shù) | 描述 |
---|---|---|
Throwable() | 構(gòu)造一個以 null 作為其詳細(xì)消息的新 throwable。 | |
Throwable(String message) | 使用指定的詳細(xì)消息構(gòu)造一個新的 throwable。 | |
Throwable(String message, Throwable cause) | 使用指定的詳細(xì)消息和原因構(gòu)造一個新的 throwable。 | |
protected | Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) | 使用指定的詳細(xì)消息、原因、啟用或禁用抑制以及啟用或禁用可寫堆棧跟蹤構(gòu)造一個新的 throwable。 |
Throwable(Throwable cause) | 使用指定的原因和 (cause==null ? null : cause.toString()) 的詳細(xì)消息構(gòu)造一個新的 throwable(通常包含原因的類和詳細(xì)消息)。 |
修飾符和類型 | 方法 | 描述 |
---|---|---|
void | addSuppressed(Throwable exception) | 將指定的異常附加到為傳遞此異常而被抑制的異常。 |
Throwable | fillInStackTrace() | 填寫執(zhí)行堆棧跟蹤。 |
Throwable | getCause() | 如果原因不存在或未知,則返回此 throwable 的原因或 null。 |
String | getLocalizedMessage() | 創(chuàng)建此 throwable 的本地化描述。 |
String | getMessage() | 返回此 throwable 的詳細(xì)消息字符串。 |
StackTraceElement[] | getStackTrace() | 提供對 printStackTrace() 打印的堆棧跟蹤信息的編程訪問。 |
Throwable[] | getSuppressed() | 返回一個數(shù)組,其中包含通常由 try-with-resources 語句抑制的所有異常,以傳遞此異常。 |
Throwable | initCause(Throwable cause) | 將此 throwable 的原因初始化為指定值。 |
void | printStackTrace() | 將此 throwable 及其回溯打印到標(biāo)準(zhǔn)錯誤流。 |
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 |
public Throwable()
構(gòu)造一個以 null 作為其詳細(xì)消息的新 throwable。 原因未初始化,隨后可能通過調(diào)用 initCause(java.lang.Throwable) 進(jìn)行初始化。
調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。
public Throwable(String message)
使用指定的詳細(xì)消息構(gòu)造一個新的 throwable。 原因未初始化,隨后可能通過調(diào)用 initCause(java.lang.Throwable) 進(jìn)行初始化。
調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
message | 詳細(xì)信息。 詳細(xì)消息被保存以供以后通過 getMessage() 方法檢索。 |
public Throwable(String message, Throwable cause)
使用指定的詳細(xì)消息和原因構(gòu)造一個新的 throwable。
請注意,與原因關(guān)聯(lián)的詳細(xì)消息不會自動合并到此 throwable 的詳細(xì)消息中。
調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
message | 詳細(xì)消息(保存以供以后通過 getMessage() 方法檢索)。 |
cause | 原因(由 getCause() 方法保存以供以后檢索)。 (允許使用空值,表示原因不存在或未知。) |
public Throwable(Throwable cause)
使用指定的原因和 (cause==null ? null : cause.toString()) 的詳細(xì)消息構(gòu)造一個新的 throwable(通常包含原因的類和詳細(xì)消息)。 此構(gòu)造函數(shù)對于僅是其他 throwable 的包裝器(例如 PrivilegedActionException)的 throwable 很有用。
調(diào)用 fillInStackTrace() 方法來初始化新創(chuàng)建的 throwable 中的堆棧跟蹤數(shù)據(jù)。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
cause | 原因(由 getCause() 方法保存以供以后檢索)。 (允許使用空值,表示原因不存在或未知。) |
protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
使用指定的詳細(xì)消息、原因、啟用或禁用抑制以及啟用或禁用可寫堆棧跟蹤構(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)禁用抑制,例如虛擬機(jī)在內(nèi)存不足的情況下重用異常對象。重復(fù)捕獲和重新拋出給定異常對象的情況,例如實(shí)現(xiàn)兩個子系統(tǒng)之間的控制流,是不可變可拋出對象適用的另一種情況。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
message | 詳細(xì)信息。 |
cause | 原因。 (允許使用空值,表示原因不存在或未知。) |
enableSuppression | 是否啟用或禁用抑制 |
writableStackTrace | 堆棧跟蹤是否應(yīng)該是可寫的 |
public String getMessage()
返回此 throwable 的詳細(xì)消息字符串。
返回:
此 Throwable 實(shí)例的詳細(xì)消息字符串(可能為 null)。
public String getLocalizedMessage()
創(chuàng)建此 throwable 的本地化描述。 子類可以覆蓋此方法以生成特定于語言環(huán)境的消息。 對于不覆蓋此方法的子類,默認(rèn)實(shí)現(xiàn)返回與 getMessage() 相同的結(jié)果。
返回:
此 throwable 的本地化描述。
public Throwable getCause()
如果原因不存在或未知,則返回此 throwable 的原因或 null。 (原因是導(dǎo)致這個 throwable 被拋出的 throwable。)
此實(shí)現(xiàn)返回通過需要 Throwable 的構(gòu)造函數(shù)之一提供的原因,或者在使用 initCause(java.lang.Throwable) 方法創(chuàng)建之后設(shè)置的原因。 雖然通常不需要重寫此方法,但子類可以重寫它以返回通過其他方式設(shè)置的原因。 這適用于早于將鏈?zhǔn)疆惓L砑拥?Throwable 的“傳統(tǒng)鏈?zhǔn)?throwable”。 請注意,沒有必要重寫任何 PrintStackTrace 方法,所有這些方法都會調(diào)用 getCause 方法來確定 throwable 的原因。
返回:
如果原因不存在或未知,則返回此 throwable 的原因或 null。
public Throwable initCause(Throwable cause)
將此 throwable 的原因初始化為指定值。 (原因是導(dǎo)致這個 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 實(shí)例的引用。
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)用過。 |
public String toString()
返回此 throwable 的簡短描述。 結(jié)果是以下內(nèi)容的串聯(lián):
如果 getLocalizedMessage 返回 null,則只返回類名。
覆蓋:
類 Object 中的 toString
返回:
此 throwable 的字符串表示形式。
public void printStackTrace()
將此 throwable 及其回溯打印到標(biāo)準(zhǔn)錯誤流。 此方法在錯誤輸出流上打印此 Throwable 對象的堆棧跟蹤,即字段 System.err 的值。 輸出的第一行包含該對象的 toString() 方法的結(jié)果。 剩余的行表示先前由方法 fillInStackTrace() 記錄的數(shù)據(jù)。 此信息的格式取決于實(shí)現(xiàn),但以下示例可被視為典型示例:
java.lang.NullPointerException
at MyClass.mash(MyClass.java:9)
at MyClass.crunch(MyClass.java:6)
at MyClass.main(MyClass.java:3)
這個例子是通過運(yùn)行程序產(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)包括原因的回溯。 此信息的格式取決于實(shí)現(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
請注意包含字符“...”的行的存在。 這些行表明此異常的堆棧跟蹤的其余部分與此異常(“封閉”異常)導(dǎo)致的異常的堆棧跟蹤底部的指定幀數(shù)相匹配。 這種速記可以大大減少輸出的長度,在這種情況下,從與捕獲“原因異常”相同的方法拋出包裝異常的常見情況。 上面的例子是通過運(yùn)行程序產(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 語句一起使用)。 為了傳遞異常而被抑制的任何異常都將打印在堆棧跟蹤下方。 此信息的格式取決于實(shí)現(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進(jìn)。
一個異??梢杂幸粋€原因和一個或多個被抑制的異常:
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
public void printStackTrace(PrintStream s)
將此 throwable 及其回溯打印到指定的打印流。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
s | 用于輸出的 PrintStream |
public void printStackTrace(PrintWriter s)
將此 throwable 及其回溯打印到指定的打印編寫器。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
s | PrintWriter 用于輸出 |
public Throwable fillInStackTrace()
填寫執(zhí)行堆棧跟蹤。 此方法在此 Throwable 對象中記錄有關(guān)當(dāng)前線程的堆棧幀的當(dāng)前狀態(tài)的信息。
如果這個 Throwable Throwable#Throwable(String, Throwable, boolean, boolean) 的堆棧跟蹤,調(diào)用這個方法是沒有效果的。
返回:
對此 Throwable 實(shí)例的引用。
public StackTraceElement[] getStackTrace()
提供對 printStackTrace() 打印的堆棧跟蹤信息的編程訪問。返回堆棧跟蹤元素的數(shù)組,每個元素代表一個堆棧幀。數(shù)組的第零個元素(假設(shè)數(shù)組的長度不為零)表示堆棧的頂部,這是序列中的最后一個方法調(diào)用。通常,這是這個 throwable 被創(chuàng)建和拋出的點(diǎn)。數(shù)組的最后一個元素(假設(shè)數(shù)組的長度不為零)表示堆棧的底部,這是序列中的第一個方法調(diào)用。
在某些情況下,某些虛擬機(jī)可能會從堆棧跟蹤中省略一個或多個堆棧幀。在極端情況下,允許沒有關(guān)于這個 throwable 的堆棧跟蹤信息的虛擬機(jī)從這個方法返回一個長度為零的數(shù)組。一般來說,此方法返回的數(shù)組將為 printStackTrace 打印的每一幀包含一個元素。寫入返回的數(shù)組不會影響以后對該方法的調(diào)用。
返回:
堆棧跟蹤元素數(shù)組,表示與此 throwable 相關(guān)的堆棧跟蹤。
public void setStackTrace(StackTraceElement[] stackTrace)
設(shè)置將由 getStackTrace() 返回并由 printStackTrace() 和相關(guān)方法打印的堆棧跟蹤元素。 此方法專為 RPC 框架和其他高級系統(tǒng)使用而設(shè)計,允許客戶端覆蓋默認(rèn)堆棧跟蹤,該堆棧跟蹤要么在構(gòu)造 throwable 時由 fillInStackTrace() 生成,要么在從序列化流中讀取 throwable 時反序列化。
如果此 Throwable Throwable#Throwable(String, Throwable, boolean, boolean) 的堆棧跟蹤,則調(diào)用此方法除了驗(yàn)證其參數(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 |
public final void addSuppressed(Throwable exception)
將指定的異常附加到為傳遞此異常而被抑制的異常。此方法是線程安全的,通常由 try-with-resources 語句調(diào)用(自動和隱式)。
除非通過構(gòu)造函數(shù)禁用,否則會啟用抑制行為。當(dāng)抑制被禁用時,這個方法除了驗(yàn)證它的參數(shù)之外什么都不做。
請注意,當(dāng)一個異常導(dǎo)致另一個異常時,通常會捕獲第一個異常,然后拋出第二個異常作為響應(yīng)。換句話說,這兩個例外之間存在因果關(guān)系。相反,在某些情況下,可以在同級代碼塊中引發(fā)兩個獨(dú)立的異常,特別是在 try-with-resources 語句的 try 塊和關(guān)閉資源的編譯器生成的 finally 塊中。在這些情況下,只能傳播引發(fā)的異常之一。在 try-with-resources 語句中,當(dāng)有兩個這樣的異常時,將傳播源自 try 塊的異常,并將 finally 塊的異常添加到由 try 塊的異常抑制的異常列表中。當(dāng)一個異常展開堆棧時,它可以累積多個被抑制的異常。
一個異常可能已經(jīng)抑制了異常,同時也由另一個異常引起。異常是否有原因在其創(chuàng)建時在語義上是已知的,這與異常是否會抑制其他異常不同,這通常僅在拋出異常后才確定。
請注意,程序員編寫的代碼也能夠在存在多個同級異常且只能傳播一個異常的情況下調(diào)用此方法。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
exception | 要添加到抑制異常列表中的異常 |
Throws:
Throw名稱 | Throw描述 |
---|---|
IllegalArgumentException | 如果異常是可拋出的; throwable 無法抑制自身。 |
NullPointerException | 如果異常為null |
public final Throwable[] getSuppressed()
返回一個數(shù)組,其中包含通常由 try-with-resources 語句抑制的所有異常,以傳遞此異常。 如果沒有抑制異?;蚪靡种?,則返回一個空數(shù)組。 此方法是線程安全的。 寫入返回的數(shù)組不會影響以后對該方法的調(diào)用。
返回:
一個數(shù)組,其中包含為傳遞此異常而被抑制的所有異常。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: