printStackTraceの標準出力以外の方法

ド定番なのかもしれないけど、

} catch ( Exception e ) {
	StringWriter sw = new StringWriter();
	PrintWriter pw = new PrintWriter( sw );
	e.printStackTrace( pw );
	logger.error( sw.toString() );
}

ってやればStringWriterの中にprintStackTraceの値が入る。
これをtoStringすればいいわけだ。


これをやっててふと思ったのだが、
StringWriterってWriterなのに、closeってコールしなくていいものか と。


そこで、StringWriter#closeに飛んでみた。

    /**
     * Closing a <tt>StringWriter</tt> has no effect. The methods in this
     * class can be called after the stream has been closed without generating
     * an <tt>IOException</tt>.
     */
    public void close() throws IOException {
    }

JavaDocみても実装を見ても、何もしないよって。
なんかメモリ上の話しだし、よく考えてみれば当たり前なんだけど、
改めてよく見てみないとわからないもんだねぇ。


ちなみにPrintWriter#closeは

   public void close() {
	try {
	    synchronized (lock) {
		if (out == null)
		    return;
		out.close();
		out = null;
	    }
	}
	catch (IOException x) {
	    trouble = true;
	}
    }

で、コンストラクタで渡したWriterにたいしてcloseをしているだけなので、
今回の場合は、StringWriterなので、結果closeしても意味がないというわけでした。