- - PR -
現在の行番号の取得方法について
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2003-08-08 20:24
サーブレットの中でエラー理由と行番号を出力させたいのですが、Java2SDK1.3のプログラムの中で、C言語の__LINE__のように現在の行番号を出力させることは可能なのでしょうか?
|
|
投稿日時: 2003-08-08 20:36
new ServletException(理由);
で、コンテナがログを記録してくれるかと思います。 コンテナに投げたくなければ、Thread.dumpStack() かな。 http://java.sun.com/j2se/1.3/docs/api/java/lang/Thread.html#dumpStack() プログラム中で直接にスタックトレースを取得したければ、 new Throwable().printStackTrace(なんかのPrintStream); で取得できます。 |
|
投稿日時: 2003-08-08 23:00
すいません、質問のしかたが悪かったです。
エラー理由はThrowable#printStackTrace()の内容ではなくて、プログラムの中で編集したものを出力して、それとエラーの行番号を一緒に出力させようとしています。Java1.4ならStackTraceElement#getLineNumber()を使用すればいいのですが1.3で行いたいと思っています。 |
|
投稿日時: 2003-08-09 02:17
すいません、回答のしかたが悪かったです。
やはり3番目に挙げた方法でいけるのではないでしょうか? ごりごり、っと書くとこんな感じになります。 package stacktraceutil; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.StringTokenizer; import java.util.List; import java.util.ArrayList; import java.util.Iterator; /** * <p>Copyright: Copyright (c) 2003 ISOGI</p> */ public class StackTraceUtil { public static void main(String[] args) { System.out.println(getLineNumber()); } public static int getLineNumber(){ String theNumber = null; try{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); new Throwable().printStackTrace(ps); ps.close(); baos.close(); StringTokenizer st = new StringTokenizer(baos.toString(),"\n"); st.nextToken();//スタックトレースのフォーマットを決めつけてます st.nextToken(); String theLine = st.nextToken(); theNumber = theLine.substring(theLine.indexOf(":")+1,theLine.indexOf(")")); }catch(java.io.IOException ioe){/*will never happen*/} //Unknown source とかだったら NumberFormatExceptionでますね return Integer.parseInt(theNumber); } } [ メッセージ編集済み 編集者: インギ 編集日時 2003-08-09 02:19 ] |
|
投稿日時: 2003-08-09 09:20
log4jに、エラー場所の行番号を出力する機能があったはずなので、log4jを使うという手もありますね。
いずれにせよ、スタックトレースへのアクセスは遅いので、速度的に問題があれば、antのタスクを自分で作って、__FILE__、__LINE__を解釈できるようにするとか。 |
|
投稿日時: 2003-08-10 00:06
org.apache.log4j.spi.LocationInfoがそれですね。
LGPLでもいいのなら、 org.jboss.util.StackTraceの方が高機能なのでこちらをオススメします。 |
|
投稿日時: 2003-08-10 22:43
色々な方法があるみたいですね。スタックトレースのフォーマットはJVMの実装によって異なるらしいので、jbossやant,log4jなどのツールについて調べて使ってみようと思います。ありがとうございました。
|
1
