- PR -

現在の行番号の取得方法について

1
投稿者投稿内容
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2003-08-08 20:24
サーブレットの中でエラー理由と行番号を出力させたいのですが、Java2SDK1.3のプログラムの中で、C言語の__LINE__のように現在の行番号を出力させることは可能なのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 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); で取得できます。
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2003-08-08 23:00
すいません、質問のしかたが悪かったです。
エラー理由はThrowable#printStackTrace()の内容ではなくて、プログラムの中で編集したものを出力して、それとエラーの行番号を一緒に出力させようとしています。Java1.4ならStackTraceElement#getLineNumber()を使用すればいいのですが1.3で行いたいと思っています。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 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/02/17
投稿数: 55
投稿日時: 2003-08-09 09:20
log4jに、エラー場所の行番号を出力する機能があったはずなので、log4jを使うという手もありますね。

いずれにせよ、スタックトレースへのアクセスは遅いので、速度的に問題があれば、antのタスクを自分で作って、__FILE__、__LINE__を解釈できるようにするとか。
Emacs信者
常連さん
会議室デビュー日: 2003/08/10
投稿数: 38
投稿日時: 2003-08-10 00:06
org.apache.log4j.spi.LocationInfoがそれですね。

LGPLでもいいのなら、
org.jboss.util.StackTraceの方が高機能なのでこちらをオススメします。
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2003-08-10 22:43
色々な方法があるみたいですね。スタックトレースのフォーマットはJVMの実装によって異なるらしいので、jbossやant,log4jなどのツールについて調べて使ってみようと思います。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)