最新閲覧日:

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

a[i] = b[i] + c[i];とかくとエラーになって,
a[i] = b[i]; a[i] += c[i];と分けて書くとエラーが出なくなったので,
解決(?)はしたのですが,
これは何が原因なのでしょうか?

A 回答 (10件)

>実際Boxlistは


>int BOXlist[][] = new int[MAXCAT+1][MAXCAT];
>と定義してあります.
であれば問題ないですね。

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

#本題解決に何の役にも立たない情報で申し訳ない
    • good
    • 0
この回答へのお礼

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

結論は、JavaVMが悪かったと言う事ですっきりしました。
どうも、ありがとうございました。

お礼日時:2001/03/27 18:46

ご提示のソースをちょっと書き換えると以下のようになると思います。

(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;

この回答への補足

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

補足日時:2001/03/26 22:28
    • good
    • 0

確認です。



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

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

この回答への補足

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

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
    • good
    • 0

デバッグモードではなく、リテールモードでコンパイルされたんですかね?


例外表示に行番号が表示されていないので何とも言えないんですが・・・
行番号入っていればしらみつぶしにできるんですけどね。
ちょっとわかんないです。ごめんなさい。

この回答への補足

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

補足日時:2001/03/21 10:34
    • good
    • 0

テストは自作デスクトップ&Microsoft VMでやりました。


環境がVisual J++だったので。JDKもあるんですけどね。

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

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

また、トピックのAppletの項ももしかしたら参考になるかもしれません。

参考URL:http://java-house.etl.go.jp/ml/

この回答への補足

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

ノートのJavaVMが古いとか。

。。

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

この回答への補足

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

Appletのプログラムなのでエラーはブラウザ上でしか見ていなくて、
それでも長くてBoundsくらいまでしか見れなかったのですが、
続きに詳細が表示されてるのでしょうか?

補足日時:2001/03/18 17:47
    • good
    • 0

ああそうか・・・。



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

なんだろう・・・

この回答への補足

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

補足日時:2001/03/18 17:48
    • good
    • 0

ああ、普通のintとかcharとかの配列も、クラスオブジェクトのポインタの配列も


両方とれるという話です。

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

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

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

この回答への補足

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

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

範囲越えや要素への値の代入が問題の場合、
両方ともエラーになると思うのですが。

補足日時:2001/03/17 12:50
    • good
    • 0

Javaは配列にプリミティブデータもオブジェクトの参照もとれますし


データがどんなものはいっていたかわかんないので
質問だけじゃちょっと推測ができません。

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

この回答への補足

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

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

補足日時:2001/03/17 11:17
    • good
    • 0

私には、それだけじゃちょっとわからないです。


iがどんな値なのか判らないので。

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

この回答への補足

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

補足日時:2001/03/17 01:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


人気Q&Aランキング

おすすめ情報