ソースコード


/******************************************************************************
 * @(#) $Id$
 * Copyright (c) 2002 - 2009 NI-Lab.
 * @author NI-Lab.
 * @since 2002.XX.XX
 *****************************************************************************/
package info.nilab.lib.lang;
 
import java.io.*;
import java.util.*;
 
/**
 * 例外のユーティリティクラスです。
 * @author NI-Lab.
 */
public class Exceptionz {
  
  public static void main(String[] args){
    
    // サンプルコード
    
    // 例外チェーン
    Throwable t1 = new Throwable("t1");
    Throwable t2 = new Exception("t2", t1);
    Throwable t3 = new RuntimeException("t3", t2);
    Throwable t4 = new Throwable("t4", t3);
    Throwable t5 = new Exception("t5", t4);
    Throwable t6 = new RuntimeException("t6", t5);
    
    // スタックトレースを出力
    System.out.println("[StackTrace]");
    System.out.println(Exceptionz.getStackTraceString(t6));
    System.out.println();
    
    // RuntimeException型の例外を取得
    System.out.println("[RuntimeException]");
    Throwable[] c1 = Exceptionz.getCauses(t6, RuntimeException.class);
    for(int i=0; i<c1.length; i++){
      System.out.println(c1[i].toString());
    }
    System.out.println();
    
    // Exception型の例外を取得
    System.out.println("[Exception]");
    Throwable[] c2 = Exceptionz.getCauses(t6, Exception.class);
    for(int i=0; i<c2.length; i++){
      System.out.println(c2[i].toString());
    }
    System.out.println();
    
    // Throwable型の例外を取得
    System.out.println("[Throwable]");
    Throwable[] c3 = Exceptionz.getCauses(t6, Throwable.class);
    for(int i=0; i<c3.length; i++){
      System.out.println(c3[i].toString());
    }
    System.out.println();
    
  }
 
  /**
   * 例外オブジェクトのスタックトレースの文字列を取得します。
   * @param e 例外
   * @return スタックトレース文字列
   * @throws NullPointerException 指定した例外オブジェクトが null の場合
   */
  public static String getStackTraceString(Throwable e) {
 
    if (e == null)
      throw new NullPointerException("例外オブジェクトがnullです。");
 
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    return new String(sw.toString());
  }
  
  /**
   * チェーンされた例外から指定した型の例外を取得します。
   * @param classType 取得する例外の型
   * @return マッチした例外の一覧
   */
  public static Throwable[] getCauses(Throwable src, Class classType){
    ArrayList<Throwable> list = new ArrayList<Throwable>();
    Throwable t = src;
    // 原因がループして無限ループになる可能性は無いのか?
    while(t != null){
      if(classType.isInstance(t)){
        list.add(t);
      }
      t = t.getCause();
    }
    return list.toArray(new Throwable[list.size()]);
  }
 
}

実行結果


[StackTrace]
java.lang.RuntimeException: t6
  at info.nilab.lib.lang.Exceptionz.main(Exceptionz.java:28)
Caused by: java.lang.Exception: t5
  at info.nilab.lib.lang.Exceptionz.main(Exceptionz.java:27)
Caused by: java.lang.Throwable: t4
  at info.nilab.lib.lang.Exceptionz.main(Exceptionz.java:26)
Caused by: java.lang.RuntimeException: t3
  at info.nilab.lib.lang.Exceptionz.main(Exceptionz.java:25)
Caused by: java.lang.Exception: t2
  at info.nilab.lib.lang.Exceptionz.main(Exceptionz.java:24)
Caused by: java.lang.Throwable: t1
  at info.nilab.lib.lang.Exceptionz.main(Exceptionz.java:23)
 
 
[RuntimeException]
java.lang.RuntimeException: t6
java.lang.RuntimeException: t3
 
[Exception]
java.lang.RuntimeException: t6
java.lang.Exception: t5
java.lang.RuntimeException: t3
java.lang.Exception: t2
 
[Throwable]
java.lang.RuntimeException: t6
java.lang.Exception: t5
java.lang.Throwable: t4
java.lang.RuntimeException: t3
java.lang.Exception: t2
java.lang.Throwable: t1

tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)