iアプリで配列の使い方がわからず困っている

このQ&Aのポイント
  • iアプリで、あるクラスの配列を別のクラスで利用したい
  • Itemクラスの配列の任意の要素をTestクラスで使用する方法を教えてください
  • 配列'Item'の任意の要素(Item[258])を適用したい
回答を見る
  • ベストアンサー

iアプリで、配列の使い方がわからず困っています。

iアプリで、あるクラスの配列を別のクラスで利用したいのですが、その方法がよくわかりません。 たとえば、Itemクラスの配列の任意の要素を、Testクラスで使用したい場合、どのようにすればよいのでしょうか。 ========== Item.java ========== public class Item { String Item[] = new String[700]; Item(){ Item[0] = new String("item0"); Item[1] = new String("item1"); Item[2] = new String("item2");   ・   ・   ・ Item[699] = new String("item699"); } } ========== Test.java ========== public class Test extends IApplication { public void start(){ /* Itemクラスの配列'Item'を使用するための記述がわかりません。 */ Dialog _dialog=new Dialog(Dialog.DIALOG_INFO,"Item"); _dialog.setText("Item:" + Item[258]); // ← 配列'Item'の任意の要素(Item[258])を適用したい。 _dialog.show(); terminate(); } }

  • dig3
  • お礼率33% (2/6)
  • Java
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

> "java.lang.Array.IndexOutOfBoundsException" というエラーが出ました。 ArrayIndexOutOfBoundsExceptionは、配列アクセス時の添字の範囲が間違っていることを表します。 使われている配列がItemのitemArrayだけだとすると、プログラムに示されている範囲では添字の値(0, 1, 2, 699, 258)に問題ありませんから、省略されている部分のどこかでマイナスまたは700以上の数を添字に使ってしまっているんじゃないでしょうか。

dig3
質問者

お礼

ご指摘のように添字の一つに誤りがありました。653が753となっていました。 添字を直したら、上手くいきました。 結局、配列の場合も変数の場合も参照の仕方には違いはないのですね。少し意外な感じがしました。 配列と変数とでは、参照の仕方が違っているにちがいないという変な思い込みがあったせいでしょうか 最初に700個の要素数でエラーが出ると、それに拘泥してしまい、要素数を少なめにしてテストするとかするという機転がききませんでした。 大変参考になりました。ありがとうございました。

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

質問タイトルに「配列の使い方」とありますけど、配列かどうかは関係なくて、他のクラスのインスタンス変数をどうやって参照するかという質問ですよね。 > 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では、クラス名は大文字で、ローカル変数やインスタンス変数名は小文字で書き始める慣習です。)

dig3
質問者

補足

おかげ様でインスタンス変数の参照の仕方がよく分かりました。 ともかく、不明点が明らかになりすっきりしました。 ところで、元々やりたかったことは、他クラスの「配列」を参照することだったので、改めてこちらの問題もご教示いただけないでしょうか。 つまり、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)
回答No.1

配列じゃなくってただの変数なら分かりますか?

dig3
質問者

補足

>配列じゃなくってただの変数なら分かりますか? 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(); } }

関連するQ&A

  • <identifier>がありません

    Javaのプログラムの勉強をやっていて、初心者なのですが、早速分からないことに当たってしまいました。 Webで調べても分かりませんでした。 どなたかご指導お願いします。 初歩的な質問ですみません。 //ソースコードの例 import com.nttdocomo.ui.*; public class while extends IApplication{ public void start(){ Dialog outDlg=new Dialog(Dialog.DIALOG_INFO,\"結果\"); int i,sum; sum=0; i=1; while(i<=10){ sum=sum+1; i=i+1; } outDlg.setText(\"合計=\"+sum); outDlg.show(); terminate(); } }

  • private voidなメソッドはstatic コンテキストですか

    コンパイルエラーで、 「static コンテキストから参照することはできません」 と表示されます。 ソースにstaticという文字は有りません。 private voidなメソッドはstatic コンテキストですか? [Foo.java] import com.nttdocomo.ui.*; public class Foo extends IApplication {  public void start() {   Display.setCurrent(new MyPanel());  } } class MyPanel extends Panel {  private void e() {   Bar.DShow(Dialog.DIALOG_ERROR, "", "");  } } [Bar.java] import com.nttdocomo.ui.*; public class Bar {  public void DShow(int type, String title, String body) {   Dialog d = new Dialog(type, title);   d.setText(body);   d.show();  } }

    • ベストアンサー
    • Java
  • iアプリでのHTTP通信について

    こんばんわ。大変困っています。 現在、iアプリで業務アプリの開発を行っています。 HTTP通信によりサーバ上のテキストファイルを読み込もうとしているのですがどうもうまくいきません。 開発環境はdoja5.1+eclipse3を使用しております。 ADFの設定はPackageURL及びUseNetworkを設定しております。 この状態で以下のソースコードをデバッグ起動すると「httpc.connect();」にてConnectionExceptionが発生し、statusの値は0です。 APIリファレンスを参照しても「UNDEFINED:未定義の例外を表します」とあり、何のこっちゃわかりません。 どんな情報でもいいので宜しくお願いいたします。 以下はHTTP通信部分のソースです。 public String HttpGetTest(){ String strRet=""; try { HttpConnection httpc = (HttpConnection)Connector.open(getSourceURL()+"test.txt",Connector.READ,true); httpc.setRequestMethod(HttpConnection.GET); httpc.connect(); int respCode=httpc.getResponseCode(); String respMsg=httpc.getResponseMessage(); long contentLength=httpc.getLength(); if (respCode == HttpConnection.HTTP_OK) { byte rcvData[] = new byte[(int)contentLength]; InputStream ips=httpc.openInputStream(); ips.read(rcvData); ips.close(); strRet = new String(rcvData); } httpc.close(); }catch(ConnectionException ce){ Dialog dlgWarning = new Dialog(Dialog.DIALOG_ERROR,"ConnectionException"); dlgWarning.setText(ce.toString() + ":" + ce.getStatus()); dlgWarning.show(); } catch(Exception e){ Dialog dlgWarning = new Dialog(Dialog.DIALOG_ERROR,"Exception"); dlgWarning.setText(e.toString()); dlgWarning.show(); } return strRet; }

    • ベストアンサー
    • Java
  • [iアプリ]配列の格納について

    iアプリでクイズを出題できるように現在制作しています。 その中でテキストファイルのリソースから文字列を読み込んで、","などで区切って配列に格納したいと思っています。 ソースは以下のとおりです。 class myPanel extends Panel{ public myPanel(){ BufferedReader in = null; String line = null; String[] kugi = null; String delim=","; try { // リソース接続処理 InputStream instream = Connector.openInputStream("resource:///test.txt"); InputStreamReader inreader = new InputStreamReader(instream); in = new BufferedReader(inreader); // テキスト読込み処理 while((line = in.readLine())!= null) { kugi = line.split(delim); Label myLabel = new Label(kugi[0]); add(myLabel); } } catch(Exception e) { e.printStackTrace(); } finally { try { in.close(); } catch(Exception e) {} } } } test.txtには 問題,答え1,答え2,答え3,答え4,答え5 といれているのですが以下のエラーがでます。 C:\~\Loadtext.java:28: シンボルを解決できません。 シンボル:メソッドsplit(java.lang.String) 場所:java.lang.Stringのクラス kugi = line.split(delim);      ^ エラー 1 個 ここからずっと進みません。 初歩的かもしれませんが、どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • iアプリの作成で画像が再描画されません。

    iアプリの作成で画像が再描画されません。 どうしても解決できないのでご教示下さい。 iアプリの作成をしながら勉強しています。 利用しているプロファイルはdoja 5.1です。 class MainCanvas extends Canvas {  public void paint(Graphics g) {   MediaImage mi = MediaManager.getImage("resource:///6.gif");   try {    mi.use();   } catch(Exception e) {    //何らかの例外処理   }   Image image = mi.getImage();   getGraphics().drawImage(image, 20, 0);  }    public void processEvent(int type, int param) {  if (type==Display.KEY_PRESSED_EVENT) {     if (param == Display.KEY_SELECT) {      Dialog dlg = new Dialog(Dialog.DIALOG_YESNO, "終了");      dlg.setText("終了しますか?");      int result = dlg.show();      if (result == Dialog.BUTTON_YES) {       IApplication.getCurrentApp().terminate();      }     }   if (param == Display.KEY_SOFT1) {    MediaImage mi = MediaManager.getImage("resource:///9.gif");    try {     mi.use();    } catch(Exception e) {     //何らかの例外処理    }    Image image = mi.getImage();    getGraphics().drawImage(image, 0, 0);         }    }  } } こんなクラスがあった時、ダイアログがキャンセルされると、 「9.gif」の方がキャンバス上から消えてしまいます。 どういう作りにすると、キャンバスから画像が消えなくなる のでしょうか?

    • ベストアンサー
    • Java
  • 配列クラスのクラス名

    配列クラスのクラス名 配列クラスのクラス名を教えてください。 配列はクラスですよね。そこまでは分かります。 こんなコードを実行しましたが System.out.println((new int[0]).getClass()); System.out.println((new boolean[0]).getClass()); System.out.println((new String[0]).getClass()); System.out.println((new Integer[0]).getClass()); 親切にこのような結果を出力してくれます。 class [I class [Z class [Ljava.lang.String; class [Ljava.lang.Integer; 結果として配列が何というクラスなのかは分かりません。 (もしかして『[I』『[Z』『[L』という名前のクラスでしょうか?) 昔Javaのソースを読んだときに、配列クラスのファイルも 読んだことがあるような気がするのですが、 なんと言うクラスだったか忘れてしまいました。 パッケージ名+クラス名を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • iアプリとサーブレットの連動(eclipse)

    はじめまして、java初心者の者です。 現在私は、eclipseを使って、iアプリ開発に挑戦しています。 その中で、iアプリとサーブレットを連動させる方法が分からず、困っています。 iアプリ上の画面で、aと入力してサーブレットに送ると、サーブレットでテキストデータを書き換え、Aに変更して送り返すという、本当に初歩的な動作を試したいのですが、上手く連動してくれません。 ネット上のサンプルソースを丸写しで使っても動かないため、おそらく設定やファイルの置き場所、接続先の記述などに問題があるのだと思います。 インターネット等でいろいろと情報を集めてみたのですが、そもそもeclipseの中でDoJaプロジェクトを作成した場合、サーブレットを使うにはどのような設定が必要なのか、またデータはどのフォルダへ保存するべきなのかといった基礎的な情報が収集できず、困っています。 tomcatプロジェクトを作成し、その中でjspとサーブレットを連動させるテストは成功したのですが、DoJaプロジェクトではweb.xmlファイルを作らなくていいのか?など、本当に基礎的な部分が全く理解できていません・・・。 また、以下がネット上で拾ったサンプルコードです。 同じフォルダにあるサーブレット(Test)と連動させたいと思っているのですが、下記に何か間違いはないのでしょうか? ---------------------------------------------------------------- import com.nttdocomo.ui.*; import java.io.*; import com.nttdocomo.io.*; import javax.microedition.io.*; public class A extends IApplication { public void start() { String res = http("servlet/Test?test=a"); showDialog(res); } void showDialog(String s) { Dialog d = new Dialog(0, "dialog"); d.setText("" + s); d.show(); } String http(String name) { String url = IApplication.getCurrentApp().getSourceURL(); url += name; String res = null; HttpConnection conn = null; try { conn = (HttpConnection)Connector.open(url, Connector.READ); conn.setRequestMethod(HttpConnection.GET); conn.connect(); InputStream in = conn.openInputStream(); int len = (int)conn.getLength(); byte[] buf = new byte[len]; int off = 0; for (;;) { int n = in.read(buf, off, len); if (n < 0) throw new Exception(); off += n; len -= n; if (len == 0) break; } in.close(); conn.close(); return new String(buf); } catch (Exception e) { try { conn.close(); } catch (Exception e2) { } } return null; } } --------------------------------------------------------------- 本当に基礎的な質問で申し訳ありません。 どなたかご存知の方がいらっしゃいましたら、何卒よろしくお願いいたします。 ※以下、私の環境をお伝えいたします。 ・eclipse3.1 ・DoJa-5.1 ・apache-tomcat-6.0.20

    • ベストアンサー
    • Java
  • iアプリ パネル遷移の際の変数の受け渡し方について

    iアプリで、パネル遷移の際に遷移元の変数を遷移先に引き渡したいのですが、その方法がわかりません。 テスト用のプログラムを作成しましたので、どなたかご教示いただければ幸いです。 ソフトキー1:終了 ソフトキー2:TextBoxのリセット ボタン:パネル遷移とTextBoxの入力文字の遷移先への引き渡し TextBox:受納したテキストの表示と送付用のテキストの入力 以上の機能をパネル'p1'と'p2'とに備え、二つのパネル間での遷移とテキストの受け渡しをしたいと思います。 ========== Test.java ========== public class testx extends IApplication { public void start() { P1 p1 = new P1(); P2 p2 = new P2(); Display.setCurrent(p1); } } ======== P1.java ======== public class P1 extends Panel implements ComponentListener, SoftKeyListener{ IApplication iapp; String str =""; Button btn1 = new Button("送る"); TextBox tb1=new TextBox("",33,1,TextBox.DISPLAY_ANY); P1(){ setTitle("P1"); HTMLLayout lm=new HTMLLayout(); setLayoutManager(lm); lm.begin(HTMLLayout.LEFT); add(tb1); add(btn1); lm.end(); setSoftKeyListener(this); setSoftLabel(SOFT_KEY_1,"終了"); setSoftLabel(SOFT_KEY_2,"リセット"); setComponentListener(this); Display.setCurrent(this); } public void componentAction(Component source,int type,int param){ if(type==BUTTON_PRESSED){ /* p2 からのテキストをstrと定義しTextBoxに表示したい。 その定義の仕方がわからない。 str = ; */ tb1.setText(str); /* TextBoxに新たに入力した文字列をstrと再定義。 変数strをp2に渡したい。 */ str = tb1.getText(); P2 p2 = new P2(); Display.setCurrent(p2); } } public void softKeyPressed(int softKey){ if(softKey==SOFT_KEY_1){ iapp.terminate(); } if(softKey==SOFT_KEY_2){ tb1.setText(""); } } public void softKeyReleased(int softKey){ } } ======== P2.java ======== public class P2 extends Panel implements ComponentListener, SoftKeyListener{ IApplication iapp; String str =""; Button btn1 = new Button("送る"); TextBox tb1=new TextBox("",33,1,TextBox.DISPLAY_ANY); P2(){ setTitle("P2"); HTMLLayout lm=new HTMLLayout(); setLayoutManager(lm); lm.begin(HTMLLayout.LEFT); add(tb1); add(btn1); lm.end(); setSoftKeyListener(this); setSoftLabel(SOFT_KEY_1,"終了"); setSoftLabel(SOFT_KEY_2,"リセット"); setComponentListener(this); Display.setCurrent(this); } public void componentAction(Component source,int type,int param){ if(type==BUTTON_PRESSED){ /* p1 からのテキストをstrと定義しTextBoxに表示したい。 その定義の仕方がわからない。 str = ; */ tb1.setText(str); /* TextBoxに新たに入力した文字列をstrと再定義。 変数strをp1に渡したい。 */ str = tb1.getText(); P1 p1 = new P1(); Display.setCurrent(p1); } } public void softKeyPressed(int softKey){ if(softKey==SOFT_KEY_1){ iapp.terminate(); } if(softKey==SOFT_KEY_2){ tb1.setText(""); } } public void softKeyReleased(int softKey){ } }

  • iアプリ アプリからブラウザを起動できない

    iアプリ実行中にあるキーを押すとアプリを終了しiモードで指定されたURLに繋がる処理を作りたいのですが、下記のソースを実機で試したところ「エラーが発生しました」と表示され強制終了してしまいます。 ***************************************************** switch(param){ case Display.KEY_SOFT1:   IApplication.getCurrentApp().launch(IApplication.LAUNCH_BROWSER,   new String[]{"http://~~.html"});   break; } ***************************************************** Doja4.1で実行するとコンソールにエラーらしき文字が表示されます↓ Main :java.lang.SecurityException: UseBrowser key not found in ADF test.Test java.lang.SecurityException: UseBrowser key not found in ADF java.lang.SecurityException: UseBrowser key not found in ADF 原因は何なのでしょうか?

    • ベストアンサー
    • Java
  • iアプリ Tomcatと連携

    前回の質問は、分かりづらいようなので新たに質問させていただきます。 現在、TomcatとiアプリDoja_Ver5.1、MySQLを使いDojaの方からTomcatへアクセスしTomcatからMySQLのデータを取りDojaの方へ表示させたいのですが、下記の文で何度やっても「java.lang.SecurityException: Illegal host」と出てしまいできません。 ADFファイルである、Jamファイルは、Jarファイルと同じ場所にあるので、PackageURLには「dosei_jisaku.jar」としか記述していません。 何故か、java.lang.SecurityException: Illegal hostが出て解決策も見出せずでいます;; public class dosei_jisaku extends IApplication { public void start() { mypanel wp_mypanel = new mypanel(); Display.setCurrent(wp_mypanel); } class mypanel extends Panel{ public mypanel() { add(new Label("項目名:")); TextBox w_name = new TextBox("",8,1,TextBox.DISPLAY_ANY); add(w_name); try { HttpConnection c = (HttpConnection)Connector.open("http://localhost:8080/mfs/mfs/test/dosei_jisakuSV"); ←同PCにあるTomcatのServlet(classファイル)へアクセスしています。 c.setRequestMethod(HttpConnection.GET); c.connect(); if(c.getResponseCode() != HttpConnection.HTTP_OK){ throw new IOException(); } InputStream is = c.openInputStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); for(;;){ int n = is.read(); if (n == -1) { break; } os.write(n); } String str = new String(); str = os.toString(); w_name.setText(str); os.close(); is.close(); c.close(); } catch(Throwable e) { w_name.setText("読込エラー" + e); } } } } どなたかアドバイスを頂けるようお願い致します…。

専門家に質問してみよう