No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Exceptionのnew,throwとスタックトレース

よくわかってなかったんですが、
JavaではExceptionオブジェクトをnewしたところが
スタックトレースに表示されるみたいですね。

たとえば、ExFactoryというクラスがあり、
hogehogeException という例外をnewして返却するメソッドthrowEx()を持っているとします。

ExFactory.java
1: class ExFactory {
2: /** hogehogeExceptionのインスタンスをnewして返却 */
3: hogehogeException throwEx() {
4: return new hogehogeException();
5: }
6: }
7:
8: class hogehogeException extends Exception{}
そしてこれを呼ぶクラス ThrowTest というクラスがあり、
以下の様にthrowExを呼び出しているとします。
ThrowTest.java
1: class ThrowTest {
2: /** メインで例外発生! */
3: public static void main(String[] args)
4: throws hogehogeException {
5: ExFactory exFactory = new ExFactory();
6: throw exFactory.throwEx();
7: }
8: }
この場合、スタックトレースに出力される先頭行の行は、
ThrowTest.main ではなく ExFactory.throwEx となります。

実行結果

Exception in thread "main" hogehogeException
at ExFactory.throwEx(ExFactory.java:4)
at ThrowTest.main(ThrowTest.java:6)
これは当然と言えば当然かもしれません。
例外はキャッチしてスローしなおすこともありますから。
根本原因(new された行を特定できないと意味が無いってことなんでしょうね…。