無意味なスタックトレースの伸ばし方

JavaのThrowableがもつスタックトレースはThrowableオブジェクトがnewされたときに、
VMのスタックを見に行きトレースを埋めるという仕様になっているらしい。
Throwableのコンストラクタでは、nativeメソッドThrowable.fillInStackTraceが必ず呼ばれている。
そこで
再帰でスタックを積んだところで例外をnewするとスタックトレースを伸ばすことができる。
スローする場所は関係ない。

package hoge;


public class ThrowableExp3 extends RuntimeException{
	
	public static void main(String[] args) {
		Throwable t = makeThrowable(null, 10);
		try {
			throw t;
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
	
	public static Throwable makeThrowable(Throwable t, int n){
		Throwable t2 = new Throwable("throwable" + n , t);
		if(n <= 0){
			return t2;
		}
		return makeThrowable(t2, n-1);
	}
}

Throwableのcauseは、スタックの上から降ってきたThrowableをcatchして
下に投げるというのが普通の使い方。
スタックの下からやってきたThrowable(makeThrowableの引数)を原因にすると、意味がないトレースを吐くことができる。