-PR-
解決済み

ArrayIndexOutOfBoundsException

  • 暇なときにでも
  • 質問No.52595
  • 閲覧数443
  • ありがとう数4
  • 気になる数0
  • 回答数10
  • コメント数0

お礼率 62% (82/132)

JavaAppletのプログラムを走らせたところ,
MacやデスクトップのWindowsマシンでは正常に動作したのに,
Windowsノートでのみタイトルのエラーが出ました.

a[i] = b[i] + c[i];とかくとエラーになって,
a[i] = b[i]; a[i] += c[i];と分けて書くとエラーが出なくなったので,
解決(?)はしたのですが,
これは何が原因なのでしょうか?
通報する
  • 回答数10
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.8
レベル9

ベストアンサー率 30% (25/81)

確認です。

int a[] = new int[10];
は以前の補足にありましたが、
b、cも同じ int[] ですか?

#でも、他のマシンなら動いてるんだもんな。プログラムが原因じゃないな。。。
#そうなると、疑うべきはVMなんだよな。。。
補足コメント
sunasearch

お礼率 62% (82/132)

簡単な問題かなと思いましたので表記は簡略化していたのですが,
いちおう正確な記述を挙げておきます.
もし,よろしければご覧頂ければ幸いです.

final int MAXCAT = 10;
final int MAXKEY = 143;
int rx[] = new int[MAXKEY];
int ry[] = new int[MAXKEY];
int boxx[] = new int[MAXCAT];
int boxy[] = new int[MAXCAT];
int boxsizex[] = new int[MAXCAT];
int boxsizey[] = new int[MAXCAT];
が宣言で,
rx[NT-k] = boxx[BOXlist[CLnumber[i+1]][CLsubnumber[i+1]]];
rx[NT-k] += boxsizex[BOXlist[CLnumber[i+1]][CLsubnumber[i+1]]]/2;
が,問題の行になります.
このように2つに分けるとエラーはでません.

また,プログラム中の次の行にあります
ry[NT-k] = boxy[BOXlist[CLnumber[i+1]][CLsubnumber[i+1]]]
+ (j+1)*(FONTSIZE+6) + (FONTSIZE+6)/2;
もエラーは出ていません.
投稿日時 - 2001-03-23 10:44:16
関連するQ&A
-PR-
-PR-

その他の回答 (全9件)

  • 回答No.2
レベル11

ベストアンサー率 37% (110/293)

Javaは配列にプリミティブデータもオブジェクトの参照もとれますし データがどんなものはいっていたかわかんないので 質問だけじゃちょっと推測ができません。 宣言と代入部分をある程度引用していただければありがたいのですけど。 ...続きを読む
Javaは配列にプリミティブデータもオブジェクトの参照もとれますし
データがどんなものはいっていたかわかんないので
質問だけじゃちょっと推測ができません。

宣言と代入部分をある程度引用していただければありがたいのですけど。
補足コメント
sunasearch

お礼率 62% (82/132)

すみません。「プリミティブデータ」と「オブジェクトの参照」の意味がわからないので、教えていただければ幸いです。
配列はint型で、
int a[] = new int[10];
と宣言しました。
添え字が宣言の範囲(0-9)を越えることはなく、他の部分では正常に動作しました。

個人的には、 b[i]+c[i]の記述がそれぞれの値の足し算ではなく、
値へのポインタの足し算になっているような気がします。(エラーの内容から)
ただ、それがマシン依存なのかJavaのバージョンのせいなのか、
このエラー原因の推測が正しいのかは全くの不明です。
投稿日時 - 2001-03-17 11:17:35


  • 回答No.1
レベル1

ベストアンサー率 0% (0/1)

私には、それだけじゃちょっとわからないです。 iがどんな値なのか判らないので。 ちなみに、ArrayIndexOutOfBoundsExceptionは int a[]=new int[12]; と定義したときに、 a[12]=12; a[-1]=-1; とか、定義した範囲外のインデックスを使おうとすると起こります。 (ご存じでしたら、失礼しました。) ...続きを読む
私には、それだけじゃちょっとわからないです。
iがどんな値なのか判らないので。

ちなみに、ArrayIndexOutOfBoundsExceptionは
int a[]=new int[12];
と定義したときに、
a[12]=12;
a[-1]=-1;
とか、定義した範囲外のインデックスを使おうとすると起こります。
(ご存じでしたら、失礼しました。)
補足コメント
sunasearch

お礼率 62% (82/132)

iは0でした。
ちなみに、c[i]の代わりにc[0]としてもエラーになりました。
投稿日時 - 2001-03-17 01:41:53
  • 回答No.6
レベル11

ベストアンサー率 37% (110/293)

テストは自作デスクトップ&Microsoft VMでやりました。 環境がVisual J++だったので。JDKもあるんですけどね。 エラーがブラウザ上でしか見ていないと言うことですが、 #ブラウザ上の何なのかが書かれていないのですが #多分ステータス領域のこととして話を進めます 下記リンク内のスペシャルトピック(必読)の 「「Java Console」を調べずに「動きません」と報告して ...続きを読む
テストは自作デスクトップ&Microsoft VMでやりました。
環境がVisual J++だったので。JDKもあるんですけどね。

エラーがブラウザ上でしか見ていないと言うことですが、
#ブラウザ上の何なのかが書かれていないのですが
#多分ステータス領域のこととして話を進めます

下記リンク内のスペシャルトピック(必読)の
「「Java Console」を調べずに「動きません」と報告してはならない 」
のリンクをご参照ください

また、トピックのAppletの項ももしかしたら参考になるかもしれません。
補足コメント
sunasearch

お礼率 62% (82/132)

すみません.エラーの詳細は以下のようでした.
関数initの中の関数readdataの中の関数calculate_placeでエラーが起きているということ以外にわかる事実がありますでしょうか?

java.lang.ArrayIndexOutOfBoundsException
at sunasearch9.calculate_place
at sunasearch9.readdata
at sunasearch9.init
at com/ms/applet/AppletPanel.securedCall0
at com/ms/applet/AppletPanel.securedCall
at com/ms/applet/AppletPanel.processSentEvent
at com/ms/applet/AppletPanel.processSentEvent
at com/ms/applet/AppletPanel.run
at java/lang/Thread.run
投稿日時 - 2001-03-19 14:29:31
  • 回答No.5
レベル9

ベストアンサー率 30% (25/81)

ノートのJavaVMが古いとか。。。 エラーは ArrayIndexOutOfBoundsException と(長い)1語だけですか? 一緒に表示されれたメッセージをそのまま載せてくれたほうが解決する可能性が高いと思いますよ。 ...続きを読む
ノートのJavaVMが古いとか。。。

エラーは ArrayIndexOutOfBoundsException と(長い)1語だけですか?
一緒に表示されれたメッセージをそのまま載せてくれたほうが解決する可能性が高いと思いますよ。
補足コメント
sunasearch

お礼率 62% (82/132)

ノートは3種類くらいで試したのですが、一つはmebiusのMJ140Rで比較的
新しいと思うのですが、ノートの新しさには比例してないのかな。
JavaVMのせいと言われればそれまでですが、
エラーとの相関関係はどうなんでしょうか?
(これがいわゆるJavaのバグってやつなのかな。。。)

Appletのプログラムなのでエラーはブラウザ上でしか見ていなくて、
それでも長くてBoundsくらいまでしか見れなかったのですが、
続きに詳細が表示されてるのでしょうか?
投稿日時 - 2001-03-18 17:47:32
  • 回答No.7
レベル11

ベストアンサー率 37% (110/293)

デバッグモードではなく、リテールモードでコンパイルされたんですかね? 例外表示に行番号が表示されていないので何とも言えないんですが・・・ 行番号入っていればしらみつぶしにできるんですけどね。 ちょっとわかんないです。ごめんなさい。 ...続きを読む
デバッグモードではなく、リテールモードでコンパイルされたんですかね?
例外表示に行番号が表示されていないので何とも言えないんですが・・・
行番号入っていればしらみつぶしにできるんですけどね。
ちょっとわかんないです。ごめんなさい。
補足コメント
sunasearch

お礼率 62% (82/132)

しらみつぶしにして,見つけたのが質問の行なのです.
その行をコメントアウトしてもエラーは出なくなります.
(動作はもちろん,所期のものとは異なりますが)
投稿日時 - 2001-03-21 10:34:39
  • 回答No.3
レベル11

ベストアンサー率 37% (110/293)

ああ、普通のintとかcharとかの配列も、クラスオブジェクトのポインタの配列も 両方とれるという話です。 でも、javaはポインタの足し算はできないので・・・ うーん例外の詳細を見ないとなんとも・・・ やっぱり配列の範囲越えだと思うんですけれども・・ あと、たとえ配列長確保が正常に行われていてもその要素全部に 値を代入してありますか? ...続きを読む
ああ、普通のintとかcharとかの配列も、クラスオブジェクトのポインタの配列も
両方とれるという話です。

でも、javaはポインタの足し算はできないので・・・

うーん例外の詳細を見ないとなんとも・・・

やっぱり配列の範囲越えだと思うんですけれども・・
あと、たとえ配列長確保が正常に行われていてもその要素全部に
値を代入してありますか?
補足コメント
sunasearch

お礼率 62% (82/132)

質問の繰り返しになりますが、
a[i] = b[i] + c[i];ではエラーになりますが,

a[i] = b[i]; a[i] += c[i];では「エラーにならない」のです。

範囲越えや要素への値の代入が問題の場合、
両方ともエラーになると思うのですが。
投稿日時 - 2001-03-17 12:50:01
  • 回答No.4
レベル11

ベストアンサー率 37% (110/293)

ああそうか・・・。 ちなみにそれだけするプログラム書いて実行したら大丈夫だったんですけどね、、、 なんだろう・・・ ...続きを読む
ああそうか・・・。

ちなみにそれだけするプログラム書いて実行したら大丈夫だったんですけどね、、、

なんだろう・・・
補足コメント
sunasearch

お礼率 62% (82/132)

そのプログラムはWindowsノートで動かされたのですか?
投稿日時 - 2001-03-18 17:48:51
  • 回答No.9
レベル9

ベストアンサー率 30% (25/81)

ご提示のソースをちょっと書き換えると以下のようになると思います。(1)だとエラーになって、(2)だとエラーにならない、という現象だということになります。通常のデバッグであれば、boxlistのあたりを疑うと思います(Javaには2次元配列がないので、boxlist[・]が配列を参照するように初期化する必要がある)が、今回の場合にはお手上げです。(以下のように、式をバラしてみると糸口が見つかるかもしれません ...続きを読む
ご提示のソースをちょっと書き換えると以下のようになると思います。(1)だとエラーになって、(2)だとエラーにならない、という現象だということになります。通常のデバッグであれば、boxlistのあたりを疑うと思います(Javaには2次元配列がないので、boxlist[・]が配列を参照するように初期化する必要がある)が、今回の場合にはお手上げです。(以下のように、式をバラしてみると糸口が見つかるかもしれません)

// (1)
int clNum = clNumumber[i+1];
int clSub = clSububnumber[i+1];
int box = boxlist[clNum][clSub];
rx[NT-k] = boxx[ box ] + boxsizex[ box ] / 2;

// (2)
int clNum = clNumumber[i+1];
int clSub = clSububnumber[i+1];
int box = boxlist[clNum][clSub];
rx[NT-k] = boxx[ box ];
rx[NT-k] += boxsizex[ box ] / 2;
補足コメント
sunasearch

お礼率 62% (82/132)

「Javaには2次元配列がない」の意味がわからないので教えていただけないでしょうか?
手元の本にはJavaは多次元配列もサポートしていますと書いてあるのですが..
実際Boxlistは
int BOXlist[][] = new int[MAXCAT+1][MAXCAT];
と定義してあります.
#もしかして,Perlと勘違いをなさっているのでしょうか?
投稿日時 - 2001-03-26 22:28:18
  • 回答No.10
レベル9

ベストアンサー率 30% (25/81)

>実際Boxlistは >int BOXlist[][] = new int[MAXCAT+1][MAXCAT]; >と定義してあります. であれば問題ないですね。 「Javaには2次元配列がない」とは、「C言語で言う、ポインタ配列のポインタ配列を2次元配列のように見せているが、内部的には2次元ではない」の意味です。 #本題解決に何の役にも立たない情報で申し訳ない ...続きを読む
>実際Boxlistは
>int BOXlist[][] = new int[MAXCAT+1][MAXCAT];
>と定義してあります.
であれば問題ないですね。

「Javaには2次元配列がない」とは、「C言語で言う、ポインタ配列のポインタ配列を2次元配列のように見せているが、内部的には2次元ではない」の意味です。

#本題解決に何の役にも立たない情報で申し訳ない
お礼コメント
sunasearch

お礼率 62% (82/132)

どうも、長い事お付き合い頂きありがとうございました。
あまり引っ張っても仕方の無いことですので、
この辺で締めきりとさせて頂きます。

結論は、JavaVMが悪かったと言う事ですっきりしました。
どうも、ありがとうございました。
投稿日時 - 2001-03-27 18:46:17
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ