- ベストアンサー
iアプリで配列の使い方がわからず困っている
- iアプリで、あるクラスの配列を別のクラスで利用したい
- Itemクラスの配列の任意の要素をTestクラスで使用する方法を教えてください
- 配列'Item'の任意の要素(Item[258])を適用したい
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> "java.lang.Array.IndexOutOfBoundsException" というエラーが出ました。 ArrayIndexOutOfBoundsExceptionは、配列アクセス時の添字の範囲が間違っていることを表します。 使われている配列がItemのitemArrayだけだとすると、プログラムに示されている範囲では添字の値(0, 1, 2, 699, 258)に問題ありませんから、省略されている部分のどこかでマイナスまたは700以上の数を添字に使ってしまっているんじゃないでしょうか。
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
質問タイトルに「配列の使い方」とありますけど、配列かどうかは関係なくて、他のクラスのインスタンス変数をどうやって参照するかという質問ですよね。 > setText()内の変数が、itemでもitem(str)でもなく、なぜitem.strとなるのか、よく分かりません。 あるクラス(test3x)から他のクラス(Item)のインスタンス変数(str)を参照するには、参照したいインスタンス変数を持っているのがどのインスタンスなのかを教えてあげる必要があります。なので、item.strのように書いて、変数itemに代入されているインスタンスのstrなのだとはっきりさせます。 Itemクラスのインスタンスメソッドやコンストラクタの中でインスタンス変数(str)を参照する場合は、「どのインスタンス」を指定するのを省略できるだけです。 ちなみに、item(str)と書くとstrを引数に取るitem()というメソッドの呼び出しと解釈されますが、そんなメソッドが存在しなければエラーになります。item()メソッドを作ったとしても、test3xの中にはstrという変数はありませんからやっぱりエラーになります。 それにしても、クラス名もフィールド名も同じ名前にするのはコードが読みにくくなるので感心しません。たとえば下記のようにするとか。 public class Item { String itemArray[] = new String[700]; Item(){ itemArray[0] = new String("item0"); (Javaでは、クラス名は大文字で、ローカル変数やインスタンス変数名は小文字で書き始める慣習です。)
補足
おかげ様でインスタンス変数の参照の仕方がよく分かりました。 ともかく、不明点が明らかになりすっきりしました。 ところで、元々やりたかったことは、他クラスの「配列」を参照することだったので、改めてこちらの問題もご教示いただけないでしょうか。 つまり、Itemクラスの配列を、Testクラスでインスタンス化する仕方と、インスタンス化された配列要素の適用の仕方です。 ちなみに、変数参照の場合との類比から、下のようにプログラムを書き換えてみたところ、コンパイルには成功したのですが、起動時に、"java.lang.Array.IndexOutOfBoundsException" というエラーが出ました。 ========== Item.java ========== public class Item { String itemArray[] = new String[700]; Item(){ itemArray[0] = new String("item0"); itemArray[1] = new String("item1"); itemArray[2] = new String("item2"); ・ ・ ・ itemArray[699] = new String("item699"); } } ========== Test.java ========== public class Test extends IApplication { public void start(){ Item items = new Item(); Dialog _dialog=new Dialog(Dialog.DIALOG_INFO,"Item"); _dialog.setText("Item:" + items.itemArray[258]); _dialog.show(); terminate(); } }
- Tacosan
- ベストアンサー率23% (3656/15482)
配列じゃなくってただの変数なら分かりますか?
補足
>配列じゃなくってただの変数なら分かりますか? Test.java で Itemクラスをインスタンス化しなければならないことと、そのための記述法までは分かります。 クラス名 変数名 = new クラス名(); それから先の組み立て方が分かりません。 変数で以下のようにプログラムを書き直したところ偶然上手くいきました。 でも、setText()内の変数が、itemでもitem(str)でもなく、なぜitem.strとなるのか、よく分かりません。 ========== Item.java ========== public class Item { String str; Item(){ str="テスト"; } } public class test3x extends IApplication { public void start(){ Item item=new Item(); Dialog _dialog=new Dialog(Dialog.DIALOG_INFO,"Item"); _dialog.setText(item.str); _dialog.show(); terminate(); } }
お礼
ご指摘のように添字の一つに誤りがありました。653が753となっていました。 添字を直したら、上手くいきました。 結局、配列の場合も変数の場合も参照の仕方には違いはないのですね。少し意外な感じがしました。 配列と変数とでは、参照の仕方が違っているにちがいないという変な思い込みがあったせいでしょうか 最初に700個の要素数でエラーが出ると、それに拘泥してしまい、要素数を少なめにしてテストするとかするという機転がききませんでした。 大変参考になりました。ありがとうございました。