Java異常用法
訪問線程的堆棧
以下代碼顯示瞭如何獲取線程的堆棧幀。Throwable
對象在創建線程的點處捕獲線程的堆棧。參考以下代碼 -
public class Main {
public static void main(String[] args) {
m1();
}
public static void m1() {
m2();
}
public static void m2() {
m3();
}
public static void m3() {
Throwable t = new Throwable();
StackTraceElement[] frames = t.getStackTrace();
printStackDetails(frames);
}
public static void printStackDetails(StackTraceElement[] frames) {
System.out.println("Frame count: " + frames.length);
for (int i = 0; i < frames.length; i++) {
int frameIndex = i; // i = 0 means top frame
System.out.println("Frame Index: " + frameIndex);
System.out.println("File Name: " + frames[i].getFileName());
System.out.println("Class Name: " + frames[i].getClassName());
System.out.println("Method Name: " + frames[i].getMethodName());
System.out.println("Line Number: " + frames[i].getLineNumber());
}
}
}
上面的代碼生成以下結果。
Frame count: 4
Frame Index: 0
File Name: Main.java
Class Name: Main
Method Name: m3
Line Number: 12
Frame Index: 1
File Name: Main.java
Class Name: Main
Method Name: m2
Line Number: 9
Frame Index: 2
File Name: Main.java
Class Name: Main
Method Name: m1
Line Number: 6
Frame Index: 3
File Name: Main.java
Class Name: Main
Method Name: main
Line Number: 3
try-with-resources塊
Java 7添加了一個名爲try-with-resources
的新結構。使用Java 7中的新的try-with-resources
構造,上面的代碼可以寫成 -
try (AnyResource aRes = create the resource...) {
// Work with the resource here.
// The resource will be closed automatically.
}
當程序退出構造時,try-with-resources
構造自動關閉資源。資源嘗試構造可以具有一個或多個catch
塊和/或finally
塊。可以在try-with-resources
塊中指定多個資源。兩個資源必須用分號分隔。
最後一個資源不能後跟分號。以下代碼顯示了try-with-resources
使用一個和多個資源的一些用法(語法):
try (AnyResource aRes1 = getResource1()) {
// Use aRes1 here
}
try (AnyResource aRes1 = getResource1(); AnyResource aRes2 = getResource2()) {
// Use aRes1 and aRes2 here
}
在try-with-resources
中指定的資源是隱式最終的。在try-with-resources
中的資源必須是java.lang.AutoCloseable
類型。Java7添加了AutoCloseable
接口,它有一個close()
方法。當程序退出try-with-resources
塊時,將自動調用所有資源的close()
方法。
在多個資源的情況下,按照指定資源的相反順序調用close()
方法。
class MyResource implements AutoCloseable {
public MyResource() {
System.out.println("Creating MyResource.");
}
@Override
public void close() {
System.out.println("Closing MyResource...");
}
}
public class Main {
public static void main(String[] args) {
try (MyResource mr = new MyResource();
MyResource mr2 = new MyResource()) {
}
}
}
上面的代碼生成以下結果。
Creating MyResource.
Creating MyResource.
Closing MyResource...
Closing MyResource...
多catch塊
Java 7增加了對多catch
塊的支持,以便在catch
塊中處理多種類型的異常。可以在multi-catch
塊中指定多個異常類型。每個異常之間使用豎線(|
)分隔。
捕獲三個異常:Exception1
,Exception2
和Exception3
。
try {
// May throw Exception1, Exception2, or Exception3
}
catch (Exception1 | Exception2 | Exception3 e) {
// Handle Exception1, Exception2, and Exception3
}
在多catch
塊中,不允許有通過子類化相關的替代異常。
例如,不允許以下多catch
塊,因爲Exception1
和Exception2
是Throwable
的子類:
try {
// May throw Exception1, Exception2, or Exception3
}
catch (Exception1 | Exception2 | Throwable e) {
// Handle Exceptions here
}