Android初めて見たエラーの原因=コードが長すぎ(多すぎ)ることによるエラー!?
久々にAndroidプログラミングのことを書きます。
今回、宅建アプリのレビューで、「分野ごとに正答率が表示されたらいい」というご要望をいただきました。
しかも、なぜその機能が欲しいかという理由まで丁寧に!
その理由というのが、隙間時間でアプリをやり、後から復習するときに、正答率の低い苦手なとこがすぐにわかれば便利という!
これを実際に実現しようと思った場合、足りない情報があります。
それは、その分野の問題をどのくらい解いたか、という情報です。
というのも、正答率だけでは、抵当権の分野を1問だけ解いて正解したら正答率100%となります。表面上は正答率100%となっていますが、これだけでは自分が苦手か得意か判断する情報が圧倒的に不足しています。
そのため、ここでの正答率が何問解いたうちの正答率なのか、を表示する必要があると考えたのです。
そうして出来上がった機能がこちらです。
その分野の問題のうち何問解いたのかをバーで表現しました。
そして、バーの下に正答率です。
さらに感覚的にわかるよう、バーの色を3色とし、正答率〜30%はバーの色が薄い青、正答率30%〜70%は青、正答率70%〜は濃い青という具合に正答率が高くなるほど濃い色になるようになっております。
今回、この機能をつけるにあたり、信じられないエラーに出くわしたので、そのことを書きたいと思います。
Googleで検索して調べた限りでは見つからなかったエラーです。
コードが多すぎることによるエラー
この2年間でそこそこ色々なエラーに出くわしてきました。
もっとも、大抵のエラーはLogにエラーの原因部分が出力されていますし、Googleで調べれば同じエラーの解決法が見つかります。
その中で割ときつかったのは、SQLite関係のエラーで、Logを見てもエラーの箇所が特定されていないことが多いです。
それでも、SQLiteが原因ということはわかっているので、SQLite周りで調べれば何かしら答えがあります。
今回のエラーは、SQLiteのときのように、Logを見てもエラーの箇所が特定されていません。
さらに、SQLiteのときとは異なり、エラーの原因がSQLiteとかそういう見当すらもついていないので、Googleで検索のしようもありません。
そのため、エラーの原因から自分で見つける必要がありました。
ヒントとしては、ExpandableListの親リストにバーをただ載せるところまではエラーが起きず、そこから一歩進めてバーに分野別のデータを読み込んでもエラーは起きず、重要度別のデータを読み込んでもエラーは起きず、復習別のデータを読み込んでもエラーは起きず、年度別のデータを読み込んだらエラーが出ました。
うまくいっていたところと、うまくいかなかったところがあったので、あとは両者を比較して少しずつ調べればわかります。
最初は、もちろん年度別のところでエラーが出たので、ここのコードを書き間違えたのかと思い調べました。
でも、何度確認しても間違いがありません。
エラーが出るときと出ないときをさらに細かく比較してみたところ、分野別と復習のデータを読み込んだときにはエラーがでません。
ここで、年度別のデータを読み込んでみたところ、なんとエラーは出ません。
さらに、重要度別のA+のデータだけ読み込んでもエラーはでません。
ところが、重要度別のA・B・Cのデータのいずれか1つを読み込んだ場合、なぜか先ほどうまくいっていた年度別の方でエラーが起きます。
ということは、重要度別のABCのコードがおかしいと思い、改めてコードを見返しましたが、うまくいっているA+と違いはなく、おかしなところはありませんでした。
ここで、重要度別のABCのコードが正しいことを検証するために、重要度別のA+でなく、試しに重要度別のBのデータを読み込んでみたところ、なんとエラーが出ませんでした。
ということは、コードの内容のどこかにミスがあってエラーが出るというより、別の原因があるように思えました。
そうしてふと思ったのが、コードが長すぎるのではということです。
すなわち、コードの量が原因でエラーが発生しているのかもしれない。
そう考えたのは、内容が原因でないならあとは量くらいしかないと思ったからです。
正直、他にエラーの原因が思いつかないので、試しに、これまで書いたスパゲティコードのうち、同じような処理をしていた部分をメソッドにしてまとめてみました。
これで10行のコードが1行で表せられるようになり、それが100セットくらいあったので、かなりコードをスリム化させることができました。
そうした状態で、重要度別のA+とAのデータを読み込んだところ、エラーが出ませんでした。
さらに、BとCのデータも一緒に読み込んだところ、ついにエラーが出ませんでした!
こうして、今回のエラーを克服できたのです。