Java 異常使用

2018-01-19 17:20 更新

Java面向?qū)ο蟮脑O(shè)計(jì) - Java異常使用

訪問線程的堆棧

以下代碼顯示了如何獲取線程的堆棧幀。

Throwable對(duì)象在創(chuàng)建線程的點(diǎn)處捕獲線程的堆棧。

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());
    }
  }
}

上面的代碼生成以下結(jié)果。

try-with-resources塊

Java 7添加了一個(gè)名為try-with-resources的新結(jié)構(gòu)。

使用Java 7中的新的try-with-resources構(gòu)造,上面的代碼可以寫成

try (AnyResource aRes = create the resource...) {
    // Work with the resource here. 
    // The resource will be  closed automatically.
}

當(dāng)程序退出構(gòu)造時(shí),try-with-resources構(gòu)造自動(dòng)關(guān)閉資源。

資源嘗試構(gòu)造可以具有一個(gè)或多個(gè)catch塊和/或finally塊。

我們可以在try-with-resources塊中指定多個(gè)資源。兩個(gè)資源必須用分號(hào)分隔。

最后一個(gè)資源不能后跟分號(hào)。

以下代碼顯示了try-with-resources使用一個(gè)和多個(gè)資源的一些用法:

try (AnyResource  aRes1  = getResource1())  {
    // Use aRes1  here
}

try (AnyResource  aRes1  = getResource1(); AnyResource  aRes2  = getResource2())  {
    // Use aRes1  and  aRes2  here
}

我們?cè)趖ry-with-resources中指定的資源是隱式最終的。

在try-with-resources中的資源必須是java.lang.AutoCloseable類型。

Java 7添加了AutoCloseable接口,它有一個(gè)close()方法。

當(dāng)程序退出try-with-resources塊時(shí),將自動(dòng)調(diào)用所有資源的close()方法。

在多個(gè)資源的情況下,按照指定資源的相反順序調(diào)用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()) {

    }
  }
}

上面的代碼生成以下結(jié)果。

Multi-Catch塊

Java 7增加了對(duì)多catch塊的支持,以便在catch塊中處理多種類型的異常。

我們可以在multi-catch塊中指定多個(gè)異常類型。多個(gè)異常由豎線(|)分隔。

捕獲三個(gè)異常:Exception1,Exception2和Exception3。

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

在multi-catch塊中,不允許有通過子類化相關(guān)的替代異常。

例如,不允許以下multi-catch塊,因?yàn)镋xception1和Exception2是Throwable的子類:

try  {
    // May  throw  Exception1, Exception2, or  Exception3
}
catch (Exception1 | Exception2 | Throwable    e)  {
    // Handle  Exceptions here
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)