Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

配列の受け渡し

メインクラスからサブクラスで算出させたデータ配列に格納し受け取る際に、[ArrayIndexOutOfBounds:0]という実行時エラーが出力されて実行できません。
配列の数はあっているのですがどうしても受け渡しができません・・・
ちなみに、サブクラスへの配列数はメインクラスから受け渡ししていますが、こちらの方はチェックしましたが、うまく渡せているようです。
どなたかアドバイスの方よろしくお願いいたします。

12

回答

80161

閲覧

12件の回答

評価

0

>配列の数はあっている

間違いないですか?
加えて配列の扱い方の理解も

>ちなみに、サブクラスへの配列数はメインクラスから受け渡ししていますが、こちらの方はチェックしましたが、うまく渡せているようです。

そういった必要はないんじゃないだろうかと思いますけど
それを必要とした考え方(理解)にもうまく行かない結果となった原因があったりするのかも

・受け渡し近辺,例外の発生した辺りまでのコード
・どういったデータ(配列の中身)を渡したのか
とかを示して質問してみるのがいいのかも

評価

0

まあさんご指導ありがとうございます。

>間違いないですか?
加えて配列の扱い方の理解も

配列数は間違いないです。サブクラスから
System.out.printで渡した数を変数に代入して表示させて確認しています。
すいませんが、配列の扱い方の理解とはどういった意味なのでしょうか?若輩者ですいません・・・

>そういった必要はないんじゃないだろうかと思いますけど
それを必要とした考え方(理解)にもうまく行かない結果となった原因があったりするのかも

配列数をメインクラスから渡したいのはサブクラスでいくつか用意したファイルの中からファイルを決定させるためにファイル名を渡すためです。
 そして、ファイルから読み込みを行わせてその値を配列へ代入し、メインクラスにreturnさせる設定にしています。

>・受け渡し近辺,例外の発生した辺りまでのコード
・どういったデータ(配列の中身)を渡したのか
とかを示して質問してみるのがいいのかも

ご指摘ありがとうございます。
このコードなのですが、
else if(btn==but2)
{
 err->eily=ase.Dataset2();

 eilx=ase.Dataset1();
 SELECT_CITY=ase.Start();
  SELECT_LENG=ase.Start1();
  for(i=0;i<ICC;i++){
   Graphics g=getGraphics();
   g.setColor(Color.black);
   g.drawOval(eilx[i],eily[i],10,10);
}

err->の部分に実行時エラーが発生しています。
変数eilyはint型の1次配列です。
送り側もint型の1次配列をreturnさせています。要素数も確認しました。
このeilyはファイルから読み込ませて配列に代入したのもです。型castもint型へ行っております。

評価

0

コード追加です。
配列数セットのメソッドです。
public void Dafset(String eil)
{
 if(eil==eil51){
  fname=eil51;
  CITY=51;
 }else if(eil==eil76){
  fname=eil76;
  CITY=76;
 }else{
  fname=eil101;
  CITY=101;
 }
}

配列送信側コードです。
public int[] Dataset2()
{
 int i,j;
 double px=0.0;
 double py=0.0;
 try
 {
  FileReader fa=new FileReader(fname);
  BufferedReader file=new BufferedReader(fa);
  String line="";
  for(i=0;i<CITY;i++){
   line=file.readLine();
   StringTokenizer st=new StringTokenizer  
   上の行と一行だと思ってください->(line,",");
   Seilx[i]=st.nextToken();
   Seily[i]=st.nextToken();
   eily[i]=Integer.parseInt(Seily[i]);
  }file.close();
}
catch(FileNotFoundException a)
{
 System.err.println("ファイル("+fname+")がない。");
}
catch(EOFException a)
{
 System.err.println("データがありません");
}
catch(IOException a)
{
 System.err.println("入出力エラー発生");
}return eily;
}
コンパイル時はエラー出力はないのですが、何か書き方に問題があるのでしょうか?
ご指導よろしくお願いいたします。

評価

0

配列について理解できているか
については、このサイト内の
# Javaの道 > Java基本 > 配列 −1.配列の基本
# Javaの道 > Java基本 > 配列 −2.配列のコピー列
ででも復習してみてください
最低限2つとも見る必要があるでしょう
(とりあえず気になるポイントは
>サブクラスへの配列数はメインクラスから受け渡ししています
>メインクラスからサブクラスで算出させたデータ配列に格納し受け取る)

>配列数をメインクラスから渡したいのはサブクラスでいくつか用意したファイルの中からファイルを決定させるためにファイル名を渡すためです。

というのもやりたいことが見えてませんが
(折角コードを挙げてもらいましたけど、それが判る部分はないらしい)
配列オブジェクトはオブジェクト自身がその要素数も運ぶんですよ?
(先の復習をしてみれば)

>g.drawOval(eilx[i],eily[i],10,10);
辺りで出ている話かと思いましたが
>eily=ase.Dataset2();
であるとすると、eilyに代入することで例外が出ているのではなく、Dataset2()メソッドの中でしょうね
そのメソッドの中の何処で発生しているのかを調べる/提示するなら示すことになるでしょう

>送り側もint型の1次配列をreturnさせています。要素数も確認しました。
受け取り側で受け取った後に(・・は無理だろうから返す直前とかで)確認していますか?
(これは話の中から今は関係ないと判断されることですが今後のための話です)

因みに
>[ArrayIndexOutOfBounds:0]という実行時エラーが出力され
からまず推測されるのは
int[] array = new int[0];
のようになってしまっている場合でしょう
このときarrayは要素数0という情報も持ちますが
別途渡した要素数10とかの方を見てしまっていると
確認した要素数は適切な筈なのになんでだ?
ということにも陥ったりするでしょうね
"受け取り側で受け取った後に確認"はつまり、arrayの要素数を確認しないと意味ないということです

評価

0

追記されてたんですね

問題点であろうところは追加されたコードから推測される部分もありますが
既にレスしてあるつもりですので、まずはご自分で調べてみてください
(あえてヒントになりそうなものを挙げておくなら
CITY,Seilx[],Seily[],eily[]をDafset()メソッドを呼んでからDataset2()を呼ぶまでの間にどのように扱っているか
とか)

>コンパイル時はエラー出力はないのですが、何か書き方に問題があるのでしょうか?
前にも質問の中に似たものがあったような気もしますけど
コンパイラはあくまで"書き方"(構文)が合っているかどうかを見るもの
ロジックが正しいかどうかまでは見てくれません(コンパイラの仕事ではない・・もし見てくれるのなら開発にテスト工程なんて不要だろうし、バグなんて存在し得ないとも言えるでしょう)

評価

0

まあさんご指導ありがとうございました。

配列数を渡すことが無理があったようです。
サブクラスの配列数を固定させ実行してみてところうまくいきました。
このことから処理させたいファイルごとにサブクラスを用意してファイルごとにクラスを切り替えて実行させることにします。

大変参考になりました。感謝いたします。

評価

0

>if(eil==eil51){
この判定もちと気になります。Stringなんですよね?

評価

0

mioさん

はいStringです。
eil51,eil76.eil101にはファイル名が格納されています。

評価

0

指摘を理解していただけなかったようです。
Stringの比較は==ですか?

評価

0

>サブクラスの配列数を固定させ実行してみてところうまくいきました。
>このことから処理させたいファイルごとにサブクラスを用意してファイルごとにクラスを切り替えて実行させることにします。

それだけで解決したものか疑問に思えたりもしますが
mioさんが指摘されているところも(知らず知らずのうちに)触った範囲に含まれていたりするんでしょうね

サブクラスという表現は紛らわしいような気もしないでもないですが
(クラスAとかクラスBとか、〜をするクラスのような呼び方の方がよさそうな?)
それぞれクラスを作るまでもなく、しっかり見て手直しして行けばちゃんと出来あがるでしょう

(サブクラスを)複数作るなんて面倒なことをやってしまうことになってしまったようですが、もっと基本的なところ(Javaの基礎になる部分)の理解がまだまだ必要だろうと思いますから、しっかりやっていけばそのうち判ってくるでしょう
(やっていくうちに過去に書いたコードも思い出すようなことがあれば、あのときなんてめんどくさいことしてたんだろう・・とかね)

あと、mioさんの指摘はオブジェクトの扱い方というところですね
基礎となる部分をもっと学ぶ必要があるということになるでしょう

評価

0

mioさん

すいません・・・
そうです。比較演算子を使っています。

評価

0

mioさんの指摘を理解されていないようですね・・・

まあ、この辺りは教えても問題ない部分と思いますので・・・TSPさん、オブジェクトの比較は「equalsメソッド」を使用しますよ。

Javaプログラミングの前提知識[equals()メソッド]
http://www.atmarkit.co.jp/fjava/onepoint/java/jv14.html

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。