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塊中指定多個異常型別。每個異常之間使用豎線(|)分隔。

捕獲三個異常:Exception1Exception2Exception3

try  {
    // May  throw  Exception1, Exception2, or  Exception3
}
catch (Exception1 | Exception2 | Exception3  e)  {
    // Handle  Exception1, Exception2, and  Exception3
}

在多catch塊中,不允許有通過子類化相關的替代異常。
例如,不允許以下多catch塊,因為Exception1Exception2Throwable的子類:

try  {
    // May  throw  Exception1, Exception2, or  Exception3
}
catch (Exception1 | Exception2 | Throwable    e)  {
    // Handle  Exceptions here
}