久々にJavaでAndroidアプリを書いています。新しい画面を追加し、いざ動作確認というタイミングで突然クラッシュすることほど腹立たしいことはありませんよね。私の場合、クラッシュすると同時にエラーログを吐かないので解決に苦労しました。正確にはエラーログを吐いたものの、別のviewがロードされてしまいAndroid Monitorにログが残らないというほうが正確でしょうか。
ログがでないことには問題の解決のしようがないので、どこに問題があるのかをブレークポイントを置きつつ少しづつデバッグしていく必要があります。その結果わかったのが、viewをbindするタイミングでロードされるsetContentViewで問題が起こっているということです。ここまでわかればあとは慎重に問題の箇所を割り出していくだけです。
とはいえ、Android Studioの扱いに慣れていないと問題の箇所がどんどん流れてしまうだけで問題解決には至りません。そういうときは「Force Step Into」を使うとよいでしょう。これはライブラリなどへの遷移を飛ばしてくれるので自分の書いたソースの問題を発見するのに役立ちました。
その結果判明したのは、
1 |
java.lang.RuntimeException: Unable to bind views for jp.***.activity.***Activity |
というviewのbindに失敗しているということでした。
そして慎重にさらに進むとよりクリティカルなエラーがコンソールに表示されます。このエラーは、Android MonitorではなくDebug内に表示されます。
1 |
java.lang.IllegalStateException: Required view ‘parts_name’ with ID 12345678 for method 'onCheckedSwitch' was not found. If this view is optional add '@Nullable' annotation. |
Required view ‘parts_name’、が原因でした。ソース内で指定されたパーツがviewのxmlに記載されていないことが原因でした。問題自体は単純でしたが、ここまで原因を探るのが思いの外苦労しました。もともとある画面をコピーして新しいページを作るなど時短なことを行うとこういうことが起こる可能性があります。
普段からAndroidを開発している方からすれば初歩的なことかもしれませんが、意外とハマったので記事にしました。