ソースコード
/******************************************************************************
* @(#) $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)