2012/10/11

Exception が発生した時の LogCat の読み方 (3)

穀風: Exception が発生した時の LogCat の読み方 (2) に続いて、もう少し現実的なパターンを書いておきます。

サンプルは前回までと同じものです。


Button3 を押すと、以下のような Exception が発生します。

これまでのルールだと一行目を見て、RuntimeException が発生したということになります。
まぁそれで間違いではないのですが、RuntimeException というのは例外処理を必須としない一般的な Exception です。
どんなエラーが起こったかの情報にはなりません。

実は、今回のエラーは別スレッドで起こっているので、このようなログが出力されるのです。
上から読み進めていくと、java.lang.Thread.run まで戻ったところで、突然 Caused by: という行が現れます。
ここからが今回エラーが起こったスレッドの StackTrace になります。

今までと同様に見てみると、ConcurrentModificationException が発生しているようです。
さらに上から見ていくと、MainActivity.java の 59行目がエラーの原因のようです。
59行目を見てみると、以下の様になっています。


一度、経験したことがある人であれば、Iterator を使用したループ中に対象リストから要素を削除しようとしているのが問題であることはすぐわかると思います。
しかし、そういったことを知らなかったとしても、「ConcurrentModificationException」と検索すればエラーの原因はすぐにわかるはずです。

このように、LogCat に出力される StackTrace を読めるようになると、エラーの原因、エラーの発生場所が比較的簡単にわかるようになります。
複雑な問題になってきた場合、これだけでは情報が足りない場合もありますが、有力な手がかりになるのは間違いありません。

0 件のコメント: