- - PR -
エラーメッセージのキャッチされてませんについて
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-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 ] | ||||||||
|
投稿日時: 2003-10-03 14:18
それは実装した本人以外にわからないかと・・・。
ArrayIndexOutOfBoundsExceptionはRuntimeExceptionのサブクラスなので、 キャッチする必要はありません。 http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/ArrayIndexOutOfBoundsException.html キャッチをしたければ、下記のようにするだけです。 try{ //処理 }catch(ArrayIndexBoundsException e){ e.printStackTrace(); } このレベルが解らないなら、書籍を購入して基本をしっかり勉強しないと駄目です。 だいたい、同じ現場の方に聞けば直ぐに回答が頂ける程度のものでは? | ||||||||
|
投稿日時: 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の範囲ですね。) | ||||||||
|
投稿日時: 2003-10-03 15:18
swatです。
ということは、STOP[0]を使用しないコーディングになってますね。0から使いたいのなら、getHairetuメソッドのコール後にインクリメントすればいいんじゃないですか?
そうなるようにコーディングしているからですね。 | ||||||||
|
投稿日時: 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さんへ キャッチされていないというのは、例外処理の記述がないということだったのですね。 丁寧な返事ありがとうございます。 | ||||||||
|
投稿日時: 2003-10-03 16:31
swatです。
そもそも、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-10-03 16:41
こんにちわ。いつもお世話になっております。
ソースコードを提示することは可能でしょうか?? 言葉で処理を説明するのはなかなか難しいと思うので 可能な限りソースコードを提示したほうが解決が早くなると思いますよ ちなみに私もgetHairetuを複数回実行後12になるのかな?とおもっていました。 後の書き込みからは1回の実行後に12になっているように思えるのですが… | ||||||||
