ドラクエポータルアプリが起動しない--配列の境界違反にて

2015年12月29日


Androidの「DQポータル」というアプリ(ドラゴンクエストポータルアプリ)が、起動直後にハングアップして、全く使えなくなりました。理由は「ArrayIndexOutOfBoundsException」。基本を守らないと、痛い目にあいます。

フリーズしたDQポータルアプリ

暴走の原因をチェックするには

「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.