2015年12月29日
Androidの「DQポータル」というアプリ(ドラゴンクエストポータルアプリ)が、起動直後にハングアップして、全く使えなくなりました。理由は「ArrayIndexOutOfBoundsException」。基本を守らないと、痛い目にあいます。
「DQポータル」が、起動直後に、操作全くを受け付けないままフリーズしてしまうので、理由を調べるべく、上の画像で「レポート」のボタンを押してみました。
すると、以下の画面になります。
ここで、「システム情報」をタップすると、システムの詳しい情報が表示されます。
ここで、「例外クラス名」を見ると「java.lang.ArrayIndexOutOfBoundsException」とあります。配列の範囲を守らずにアクセスを行ったことが、ハングアップの原因だと分かりました。
「ソースクラス」「ソースメソッド」も分かりますので、どのクラスのどのメソッドの中で、例外が発生したかも分かります。
さらに、「スタックトレース」をタップすると、例外が、どのようにメソッドを呼び出していくことで発生したかを、たどることができます。
「java.lang.ArrayIndexOutOfBoundsException」は、配列変数を間違った方法でアクセスすると発生する例外です。
Androidを搭載したスマホやタブレットでは、ゲームソフトなどのアプリはたいてい、Java言語などのプログラミング言語により、ロジックが書かれています。
ドラゴンクエストポータルアプリも、例外が発生したところは、直接的にはJava言語で書かれている様子です。
Java言語では、データを配列変数で持つことができます。配列変数というのは、データを入れるための箱が、複数個並んでいるイメージです。
データを入れる箱が2つあったとします。ここで、4つめの箱にデータを入れたらどうなるでしょうか?
2しかない箱に対して「4つめの箱」と言われても、そのような箱は存在しないので、処理不能となってしまいます。
このように、配列で「どの箱にアクセスするのか」を、箱がない場所に対して指示すると、「ArrayIndexOutOfBoundsException」という例外が発生し、アプリは実行を停止します。
例えば、以下のソースコードを実行すると、データを2件登録可能な配列変数の4個めにアクセスを試み、「ArrayIndexOutOfBoundsException」が発生します。
public static void main(String[] args) { int [] x = new int[2]; // 箱を2個用意する x[3] = 10; // 4つめの箱にデータ「10」をセット }
パソコンで上記のプログラムを実行すると、例外が以下のようなメッセージとして表示されます。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at test306.Test306.main(Test306.java:19)
なお、ここでは「箱が2つあって、4つめにアクセス」という形で例外を説明しましたが、DQポータルの動作としては、「箱が0つあって、3つめにアクセス」を行ったせいで暴走しているように見えます。
直接的な暴走の理由は分かりましたが、その背景は、簡単には分かりません。
おそらくは、裏で難しい処理をやっている中で、おかしなことが発生し、最終的に配列の長さやアクセスする位置がおかしくなる形で、問題が顕在化しているのでしょうけれど。
ただ、起動せずにいきなり暴走するアプリというのは、とても珍しいです。日本のゲームは世界に対して競争力を失っているんだろうなあ、となんとなく感じます。
トップページ → なにげなく自由研究(もくじ) → ドラクエポータルアプリが起動しない--配列の境界違反にて
著者のメールアドレス・Twitterアカウントは、トップページからご覧ください。
製作・著作:杉原 俊雄(すぎはら としお)
(c)2015 Sugihara Toshio. All rights reserved.