- PR -

エラーメッセージのキャッチされてませんについて

投稿者投稿内容
会議室デビュー日: 2003/10/03
投稿数: 11
投稿日時: 2003-10-03 14:02
Javaをはじめてまだ2ヶ月目の私ですが、今実行中のエラーに悩まされています。
どうか、助けて下さい。

エラーの内容:
java.lang.ArrayIndexOutOfBoundsException (キャッチされていません)

ソースコード:
//定数
public static final int STOP[] = {0,0,1,1,2,2,3,3,2,2,1,1};

//変数
private int m_ImagePos = 0;
private int m_Num = 0;

public void getHairetu(int imageNum[]) {
int num = 0;
num = imageNum[m_ImagePos]; //エラー指定箇所
m_Num = num;
}

アプレットなのでappletviewerのdebugでエラーの原因を調べる:
まず、メソッドを呼び出すところにブレークポイントを設置して、変数を
チェックしてみる。

getHairetu(STOP); //この記述のところに、設置

m_ImagePos = 1
m_Num = 0

m_ImagePos = 1 なのは、getHairetu(STOP);のまえにm_ImagePos++;を実行
しているので、ソースコード通りの処理です。

次に、エラー指定箇所にブレークポイントを設置して、変数をチェックする。
m_ImagePos = 1
m_Num = 0
imageNum = instance of int[12] (id=895)
imageNum[1] = 0

ここまでは、ソースコード通りなのですが、この後
m_ImagePos = 12
m_Num = 1

たしかに STOP[12] だと「範囲外の配列添字指定」というのは分かりますが、
どうして、m_ImagePos = 12 になってしまうのでしょうか?
STOPの要素数がm_ImagePosに代入されてしまうのと、キャッチされていない
というのが関係あるように思うのですが、何がキャッチされていないのか、
また、どのようにすればキャッチされるのですか、教えてください。
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-10-03 14:14
えっと、必要な情報になればいいのですが・・・。
public static final int STOP[] = {0,0,1,1,2,2,3,3,2,2,1,1};
を宣言した時点で、STOP[]は12個分の領域だけ確保してしまいます。
ですので、正しく動作する配列の添字は0〜11となります。
この例では、m_ImagePos++;をはじめに実行しているので、11までは正常動作し
12を渡した時点で例外となるからではないでしょうか?

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-10-03 14:24 ]
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-10-03 14:18
引用:

蔵さんの書き込み (2003-10-03 14:02) より:
たしかに STOP[12] だと「範囲外の配列添字指定」というのは分かりますが、
どうして、m_ImagePos = 12 になってしまうのでしょうか?


 それは実装した本人以外にわからないかと・・・。

引用:

STOPの要素数がm_ImagePosに代入されてしまうのと、キャッチされていない
というのが関係あるように思うのですが、何がキャッチされていないのか、
また、どのようにすればキャッチされるのですか、教えてください。


 ArrayIndexOutOfBoundsExceptionはRuntimeExceptionのサブクラスなので、
キャッチする必要はありません。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/ArrayIndexOutOfBoundsException.html
キャッチをしたければ、下記のようにするだけです。
try{
//処理
}catch(ArrayIndexBoundsException e){
e.printStackTrace();
}

 このレベルが解らないなら、書籍を購入して基本をしっかり勉強しないと駄目です。
だいたい、同じ現場の方に聞けば直ぐに回答が頂ける程度のものでは?
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-10-03 14:39
わたしも初心者ですが、、、

>ここまでは、ソースコード通りなのですが、この後
>m_ImagePos = 12
>m_Num = 1

となっていますが、m_ImagePosのインクリメントはどこでどのように
行っているのでしょうか?

>//変数
>private int m_ImagePos = 0;
>private int m_Num = 0;
>public void getHairetu(int imageNum[]) {
>int num = 0;
>num = imageNum[m_ImagePos]; //エラー指定箇所
>m_Num = num;
>}

このメソッドを見た限りだと、 num = imageNum[0];
の部分しか実行されていないと思うんですが、、

やはり java.lang.ArrayIndexOutOfBoundsException
の例外が発生したのであれば、配列の参照がおかしいわけですよね?
ようするに、(m_ImagePosのインクリメントがどのように行われているのか
記述されていないので分りませんが)Ken-Labのおっしゃるように
配列の添え字のつけ方がおかしいのではないでしょうか?
(※添え字は0からはじまります。この場合だと0〜11の範囲ですね。)

swat
常連さん
会議室デビュー日: 2002/03/21
投稿数: 33
お住まい・勤務地: 埼玉県
投稿日時: 2003-10-03 15:18
swatです。

引用:


getHairetu(STOP); //この記述のところに、設置

m_ImagePos = 1
m_Num = 0

m_ImagePos = 1 なのは、getHairetu(STOP);のまえにm_ImagePos++;を実行
しているので、ソースコード通りの処理です。



ということは、STOP[0]を使用しないコーディングになってますね。0から使いたいのなら、getHairetuメソッドのコール後にインクリメントすればいいんじゃないですか?
引用:

どうして、m_ImagePos = 12 になってしまうのでしょうか?


そうなるようにコーディングしているからですね。

会議室デビュー日: 2003/10/03
投稿数: 11
投稿日時: 2003-10-03 16:15
自分の書き方が悪かったようで、すいません。

num = imageNum[m_ImagePos];

この文が実行される前は、
m_ImagePos = 1 なのですが、
実行後には、
m_ImagePos = 12 になってしまいます。

やりたい処理:
getHairetu(STOP); を実行する。
STOPの参照アドレスが渡される。
このときm_ImagePos = 1 なので
num = STOP[1];
STOP[1] = 0 なので num = 0 になる。
と書いているつもりなのですが、、、

takuさんへ
キャッチされていないというのは、例外処理の記述がないということだったのですね。
丁寧な返事ありがとうございます。
swat
常連さん
会議室デビュー日: 2002/03/21
投稿数: 33
お住まい・勤務地: 埼玉県
投稿日時: 2003-10-03 16:31
swatです。

引用:

蔵さんの書き込み (2003-10-03 16:15) より:
自分の書き方が悪かったようで、すいません。

num = imageNum[m_ImagePos];

この文が実行される前は、
m_ImagePos = 1 なのですが、
実行後には、
m_ImagePos = 12 になってしまいます。



そもそも、getHairetu(STOP); は何回実行されているのですか?
先ほど、getHairetu(STOP); がSTOPの要素数分実行されているのではないかと思ってコメントしたのですが、たった1回のgetHairetu(STOP); の実行でそうなるのだとすれば、なぜそうなるかは、他の部分のソースコードが分かりませんので、takuさんの言うとおり、実装者にしか分からないと思いますよ。
_________________
****** swat ******
http://www.h7.dion.ne.jp/~s_wat/
http://d.hatena.ne.jp/swat/
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2003-10-03 16:41
こんにちわ。いつもお世話になっております。

ソースコードを提示することは可能でしょうか??
言葉で処理を説明するのはなかなか難しいと思うので
可能な限りソースコードを提示したほうが解決が早くなると思いますよ

ちなみに私もgetHairetuを複数回実行後12になるのかな?とおもっていました。
後の書き込みからは1回の実行後に12になっているように思えるのですが…

スキルアップ/キャリアアップ(JOB@IT)