• ベストアンサー

ArrayIndexOutOfBoundsException

JavaAppletのプログラムを走らせたところ, MacやデスクトップのWindowsマシンでは正常に動作したのに, Windowsノートでのみタイトルのエラーが出ました. a[i] = b[i] + c[i];とかくとエラーになって, a[i] = b[i]; a[i] += c[i];と分けて書くとエラーが出なくなったので, 解決(?)はしたのですが, これは何が原因なのでしょうか?

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

  • ベストアンサー
回答No.8

確認です。 int a[] = new int[10]; は以前の補足にありましたが、 b、cも同じ int[] ですか? #でも、他のマシンなら動いてるんだもんな。プログラムが原因じゃないな。。。 #そうなると、疑うべきはVMなんだよな。。。

sunasearch
質問者

補足

簡単な問題かなと思いましたので表記は簡略化していたのですが, いちおう正確な記述を挙げておきます. もし,よろしければご覧頂ければ幸いです. 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; もエラーは出ていません.

すると、全ての回答が全文表示されます。

その他の回答 (9)

回答No.10

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

sunasearch
質問者

お礼

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

すると、全ての回答が全文表示されます。
回答No.9

ご提示のソースをちょっと書き換えると以下のようになると思います。(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
質問者

補足

「Javaには2次元配列がない」の意味がわからないので教えていただけないでしょうか? 手元の本にはJavaは多次元配列もサポートしていますと書いてあるのですが.. 実際Boxlistは int BOXlist[][] = new int[MAXCAT+1][MAXCAT]; と定義してあります. #もしかして,Perlと勘違いをなさっているのでしょうか?

すると、全ての回答が全文表示されます。
回答No.7

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

sunasearch
質問者

補足

しらみつぶしにして,見つけたのが質問の行なのです. その行をコメントアウトしてもエラーは出なくなります. (動作はもちろん,所期のものとは異なりますが)

すると、全ての回答が全文表示されます。
回答No.6

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

参考URL:
http://java-house.etl.go.jp/ml/
sunasearch
質問者

補足

すみません.エラーの詳細は以下のようでした. 関数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

すると、全ての回答が全文表示されます。
回答No.5

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

sunasearch
質問者

補足

ノートは3種類くらいで試したのですが、一つはmebiusのMJ140Rで比較的 新しいと思うのですが、ノートの新しさには比例してないのかな。 JavaVMのせいと言われればそれまでですが、 エラーとの相関関係はどうなんでしょうか? (これがいわゆるJavaのバグってやつなのかな。。。) Appletのプログラムなのでエラーはブラウザ上でしか見ていなくて、 それでも長くてBoundsくらいまでしか見れなかったのですが、 続きに詳細が表示されてるのでしょうか?

すると、全ての回答が全文表示されます。
回答No.4

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

sunasearch
質問者

補足

そのプログラムはWindowsノートで動かされたのですか?

すると、全ての回答が全文表示されます。
回答No.3

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

sunasearch
質問者

補足

質問の繰り返しになりますが、 a[i] = b[i] + c[i];ではエラーになりますが, a[i] = b[i]; a[i] += c[i];では「エラーにならない」のです。 範囲越えや要素への値の代入が問題の場合、 両方ともエラーになると思うのですが。

すると、全ての回答が全文表示されます。
回答No.2

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

sunasearch
質問者

補足

すみません。「プリミティブデータ」と「オブジェクトの参照」の意味がわからないので、教えていただければ幸いです。 配列はint型で、 int a[] = new int[10]; と宣言しました。 添え字が宣言の範囲(0-9)を越えることはなく、他の部分では正常に動作しました。 個人的には、 b[i]+c[i]の記述がそれぞれの値の足し算ではなく、 値へのポインタの足し算になっているような気がします。(エラーの内容から) ただ、それがマシン依存なのかJavaのバージョンのせいなのか、 このエラー原因の推測が正しいのかは全くの不明です。

すると、全ての回答が全文表示されます。
  • ogw
  • ベストアンサー率0% (0/1)
回答No.1

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

sunasearch
質問者

補足

iは0でした。 ちなみに、c[i]の代わりにc[0]としてもエラーになりました。

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • ローランドやボス製品に関する具体的な質問をしたい方に向けた投稿。
  • 設定方法や接続の問題についての助けを求める内容。
  • 特定の製品や部品に関連した困りごとを解決するための情報が期待されています。
回答を見る

専門家に質問してみよう