例外をキャッチしてスタックトレースを次のようにログに書き込もうとしました。
log.warn(e.getMessage());
しかしそれが言ったすべては
null
だから私はそれを
log.warn(e.toString());
そして今それだけが言う
Java.lang.NullPointerException
この例外がアプリのどこで生成されているかを確認できるように、完全なスタックトレースをログに書き込むにはどうすればよいですか?
通常:
log.warn("message", e);
ただし、それはロギングフレームワークにも依存します。
使用できます
logger.log(Level.WARN, "logged exception", ex);
または
logger.warn("logged exception", ex);
リソース:
Log4jを使用すると、これは次のように行われます。
logger.error("An error occurred", exception);
最初の引数は表示されるメッセージで、2番目はスタックトレースが記録される例外(スロー可能)です。
別のオプションはcommons-loggingで、同じです。
log.error("Message", exception);
Java.util.loggingを使用すると、これは次のように実行できます。
logger.log(Level.SEVERE, "Message", exception);
Java8を使用している場合は、次のことができます。
LOGGER.error("Caught exception while methodX. Please investigate: "
+ exception
+ Arrays.asList(exception.getStackTrace())
.stream()
.map(Objects::toString)
.collect(Collectors.joining("\n"))
);
例外メソッドでは、メッセージを含む基礎となるString
はnull
です。
上記の答えは、現在取り消し済みですが、e
がnullではないが、detailMessage
クラスのThrowable
プライベートインスタンス変数がnullであることを除いて、保持されています。これがe.getMessage()
の理由です。文字列null
ですが、e.toString()
(基になるnulldetailMessage.toString
を呼び出す)はNullPointerException
をスローします。
多分あなたはこのようなものを探しています: http://www.javapractices.com/topic/TopicAction.do?Id=78
Java 8より前のバージョンを使用している場合は、これを試すことができます。
LOGGER.error("Error al recuperar proveedores de la base de datos: " +
e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){
@Override
public Object apply(Object t) {
return t.toString();
}
}).collect(Collectors.joining("\n")));