• ベストアンサー

ArrayIndexOutOfBoundsException

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

  • Java
  • 回答数10
  • ありがとう数4

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

  • ベストアンサー
回答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

  • Illustrator10が快適に使える最低限のappleのノートパソコンは?

    現在Windos版のIllustrator10を、pen4・2.8G、メモリ・1GのWindowsデスクトップマシン環境で使用しています。ノートパソコンを買おうと思うのですが、この際Macも良いかな、と。(1)仕事でIllustrator10を使用するので、それが快適に動作すること、(2)貧乏なのでできるだけ安いマシンであること、それぞれの希望についてベストな中古Macノートは何でしょうか?iBookG4(1.07GHz、1G)あたりを考えていますがどうでしょうか? よろしくお願い致します。

  • プログラム起動

    PC2台ありメーカー、型名、OS(windowsXP)同じです。 PC AとBとします。 AのCドライブ/Program FilesをBのCドライブ/Program Files一旦削除後コピーしたらBのProgram Filesにあるプログラムは正常動作しますか?

  • コマンドライン実行とPHPのEXEC実行

    C言語プログラムの不具合に悩んでいます。 ◇以下抜粋ソース static int a=0; ・・・ int 関数A(){ /*別ファイルで使用*/ ・・・   a=256; ・・・ } int 関数B(){ int i; ・・・ for(i=0;i<a;i++){ if(for文を抜ける条件){break;} } if(i==a){ printf(エラー!);} ・・・ } ◇以上抜粋ソース 上記のソースより常にi=a=0になってしまうので常にエラーとなる気がするのですがいまいち確信が持てません。 というのも、このソースは他の人から頂いたもので、コマンドラインから実行すると何故か100パーセント正常動作するのです。 しかしブラウザを起動して、PHPファイルにアクセスし、PHPのEXEC関数から実行すると3回に1回ほどの割合で(エラー!)がでます。 3回に2回は正常動作します。 似たような不具合を御経験の方がおられれば何卒御教示ください。 よろしくお願いします。

  • WindowsでコンパイルできるがUNIXではできない

    下記のプログラムは、2^-0.94を計算するものです。 このプログラムはwindows2000のマシンでコンパイルできるのですが、UNIXのマシンだと Unresolved text symbol "pow" というエラーがでてコンパイルできません。 UNIXのマシンは「cc ファイル名」でコンパイルを実行します。 どうすればコンパイルできるようになるのでしょうか。お手数ですが、教えてください。よろしくお願いします。 ※windows2000マシンのコンパイラ:Borland C++ Compiler 5.5 #include <stdio.h> #include <math.h> int main() { int a; double b,c; a=2; b=-0.94; c=pow(a,b); printf("%lf\n",c); return 0; }

  • _access関数が EACCES エラーとなる

    _access関数が EACCES エラーとなる問題があり、識者の方、どうか ご教授願います。 <環境> ・Windows2000 Pro ・VC++ 6.0 事象の説明を以下にします。 A、B、Cの3つのプログラムがあります。 A:サービスから起動されるプログラム B:Aから CreateProcess関数により起動される。 Cを CreateProcess関数により起動する。 C:Bから CreateProcess関数により起動される。 _access関数で、ネットワーク上の別のマシンの共有されている フォルダをアクセスする。 上記の環境で、A→B→Cと起動し、Cがネットワーク上の別のマシンを アクセスしようとすると EACCES のエラーになります。 (EACCES は errno.h で定義されています。) しかし、サービスのAからではなく、Bから起動した場合は正常に アクセスできます。 C単体でもOKでした。 A、B共に、CreateProcess関数の第3、4パラメータのセキュリティ関連の パラメータには NULL を指定しています。 サービスの何らかの情報を継承しているのでしょうか。 回避策、アドバイスなど、よろしくお願いします。

  • ノートとデスク、OSでインストされる中身は同じ?

    新しいMacを購入したりしてマシンの引越しのさいに、例えばMacminiのHDDをMacBookに乗せ変えて使用してもとりあえず使用できるようですが、インストールされているOSはノートでもデスクトップでも中身は変わらないものなのでしょうか?それとも個別マシン毎にインストールされるプログラムも少しずつ違うものなのでしょうか? お詳しい方、解説いただけたらと思います。よろしくお願いします。

    • ベストアンサー
    • Mac
  • PC間のファイルのコピーについて

    先日、WindowsマシンAからあるファイルをWindowsマシンB、Cにコピーしたところ、 先輩社員から 「今回のような場合、マシンB、CからマシンAのファイルを取りに行きなさい。  FTPの場合も、Getはいいけど、Putは駄目!」 と注意を受けました。 その理由を教えていただけませんでしょうか? FTPを使用する人はPutは使わないのでしょうか? 宜しくお願いします。

  • パッケージ作成後のインストール時のエラー

    VB6でプログラムを作成後、ディストリビューションウィザードでインストールファイルを作成しました。 開発機(WindowsXP)上では問題なくインストールできるのですが、Windows98SEでは 「ファイル 'C:\WINDOWS|SYSTEM\msado25.tbl'の登録中にエラーが発生しました」 と表示されます。 無視ボタン押して終了後、動作確認するとプログラムは正常に動作はします。 エラーの原因とできればエラー表示がでないようにしたいのですが・・・・・・・。

  • バージョン違いのJRE切替え方法

    2つのソフトウェアがあり、使用しているJREの バージョンがAソフトは1.3.1_05、Bソフトは1.4.2_07と なっています。 この2つのソフトウェアを1つのWindowsマシン(XP、2000)で利用したいのですが、使用するJREのバージョンを 簡単に切替はできないのでしょうか? Aソフト、Bソフト共にJREのバージョンが異なる場合は 正常動作しません。 方法をご存知でしたら教えてください。

  • Windows7 Enterprise(評価版)64Bit版のDLL検索パスについて

    Windows7 Enterprise(評価版)32Bit版をインストールし、XPで動作していた32Bit関連DLLを C:\Windows\System32 配下に格納しました。 動作を確認したところ正常に動作するようです。 ところがWindows7 Enterprise(評価版)64Bit版で同様の動作確認を行ったところ関連DLLがないためプログラムを開始できないとエラーが出てしまいます。 下記のフォルダにDLLを格納したら正常に起動できました。  ■アプリを起動したフォルダ  ■C:\Windows  ■C:\Windows\System どうして C:\Windows\System32 に格納した場合、そのDLL見つからないのか分かりません。 API関数GetSystemDirectory()を呼び出すと"C:\Windows\System32"と返却されますし環境変数 PATH には C:\Windows\System32 が設定されています。 32Bit版と64Bit版で違いがあるのでしょうか? どうぞ、ご教授お願い致します。

専門家に質問してみよう