• ベストアンサー

自分で作ったクラスのメソッドから、配列が返ってこない

こんばんは。 自分で作ったクラスのメソッドで、戻り値が配列のメソッドがあります。そのメソッドをメインプログラムから呼び出しても、値が入っていません。(空の配列が返ってくるのか、配列が返されているのかも分かりません)実行時エラーは以下の通りです。 Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:23) ソースコードは以下の通りです。 以下はメインプログラム // 自分で作成したクラスを使用しています DataProperty dp = new DataProperty( args[0] ); // ここで配列に値を入れています。 int[] intByteSize = dp.getByteSize(); System.out.println( intByteSize[0] ); 以下は自分で作ったプログラムです。 public int[] getByteSize() { if( fileNumber.equals("2004") ) { int[] intByteSize = { 8, 1, 5, 50, 8, 1, 15, 15, 3, 3, 8, 8, 11, 9, 7, 7, 1 }; return intByteSize; } 本などを見ても、構文的に間違いはないと思うんですが。。 だれか、原因の思いつく方は解答をください。よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.1

う~ん、そのgetByteSize()メソッドじゃ、コンパイル すら通らないと思うんですが。 getByteSize()は何が何でもint型の配列を返さなくて はいけないので、ifがtrue以外の場合でも何がしかの int型配列は返すようにしなければいけません。 public int[] getByteSize() {   int[] intByteSize = null;   if(fileNumber.equals("2004")) {     intByteSize = new int[]{8,1,5,...}   }   return intByteSize; } 上のメソッドの場合の戻り値の中身は、trueの場合に は「8,1,5,....」という値が入った配列。 それ以外では「null」という値が返ってきます。 int[] intByteSize = dp.getByteSize(); // nullかint型配列の参照値を得る その後で System.out.println(intByteSize[0]); とするわけですが、戻り値がnullの場合はintByteSize という参照自体がありませんのでNullPointerException という例外が発生します。 これの対策として。。。 if(intByteSize!=null) {   System.out.println(intByteSize[0]); } と「intByteSizeがnullでなければ」という条件付で 実行するか。。。 try {   System.out.println(intByteSize[0]); } catch(NullPointerException e) {   // 例外処理。何もしないなら無記述。 } とすればいいと思います。

kamkamkam3
質問者

お礼

どうも詳しいご回答ありがとうございます。 正式には、 if(fileNumber.equals("2004")) { int[] intByteSize = { 8, 1, 5....}; return intByteSize; } return null; としていました。私は、return文というのは条件に合った時点で、値を返し、その後の処理は行われないと勘違いしておりました。以下の様にすることで、解決できました。 if(fileNumber.equals("2004")) { int[] intByteSize = { 8, 1, 5....}; return intByteSize; } else { return null; } takaPさんの最後の方の解説はとても勉強になりました。このような対処方法もあるんだと、感心しました。 どうもありがとうございました。では、またの機会に。

その他の回答 (1)

回答No.2

>public int[] getByteSize() { > if( fileNumber.equals("2004") ) { > int[] intByteSize = { 8, 1, 5, 50, 8, 1, 15, 15, 3, 3, 8, 8, 11, 9, 7, 7, 1 }; > return intByteSize; >} if文が実行されなかったときの処理が書いてありません。

kamkamkam3
質問者

お礼

どうも、ご回答ありがとうございます。ifの文の次にreturn nullと書いてあります。(if文のスコープの外です) それが、原因だったらしいです。return 文はその条件に合った時、すぐに実行されると何かで聞いたので、それでも良いのかな?と信じておりました。 else 文をつくり、その中にreturn null を書く事で、解決できました。 どうもありがとうございました。

関連するQ&A

  • クラスやメソッドが理解できません

    今javaを勉強中なのですが、クラスやメソッドで生きず待ってしまいました。 メソッドの定義は 戻り値の型 メソッド名(引数リスト) {  文;  ・・・ return 式;  } ですが、メソッドから返されえる値を戻り値といますよね?呼び出し元に値を返すってどういうことなのでしょうか? int getNum() { System.out.println("調べました") return num; } たとえば、上記のようなものですが。もしも、このメソッドを呼び出すと、”戻り値”が戻ってくるわけですが、これはgetNumという変数のなかに計算式が入っている?という考え方でいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 計算クラスのメソッドについて

    <問題> Mainクラス mainメソッド 1)実行時に引数を2つ付けて実行する。(数字) 2)計算クラスのオブジェクトを生成。 3)argsの0番目と1番目から値を取得し、int型に変換する。 4)int型に変換した値2つを引数として、計算クラスの足し算メソ   ッドを実行し、戻り値を取得して表示する。 計算クラス 足し算メソッド(引数=int,int) 1)int型の数字を引数として2つ受け取る。 2)二つの引数の値を足し算する。 3)計算した値を戻り値とする。 *********************************************************** 上記の問題についての質問です。 最初mathくらすのメソッドを使うのかと思ったのですが、 足し算を計算するようなメソッドが無かったのでネットで検索 して見つけたcalcAdd()というメソッドを使って記述してみました。 でも「シンボルを見つけられません」のエラーが出てコンパイル 出来ないし、メソッドの使い方も違うような気がするので、 分かる方正しい記述の仕方を教えてください。 package siryou; class Keisan { int cal; int cul; public int tashizan(int a, int u) { cal = a; cul = u; int kekka = (Integer)calcAdd(cal, cul, 0); return kekka; } } class TashiHikiKakeWari { public static void main(String args[]) { Keisan ki = new Keisan(); String str1 = args[0]; String str2 = args[1]; int res1 = Integer.parseInt(str1); int res2 = Integer.parseInt(str2); ki.tashizan(res1, res2); int kekka = ki.tashizan(res1, res2); System.out.println(kekka); } } ************************************************************ calcAdd()メソッドの呼び出し方も間違っている気がするのですが、 そもそもこのメソッドって呼び出せば自動的に計算されるように なっているのですか? それとも足し算を計算する記述は別にしなければならないのでしょうか?

    • ベストアンサー
    • Java
  • メソッドの引数にクラス配列を指定した場合…?

    問題のソースの構造を簡略化して書きます。 class superA { } class subB extends superA { } class mainC { public static void main(String[] abc) { /* superAとsubBをインスタンス化して 利用。int変数に値を入れている。 */ } } class questionD { public static int EEE(superA[] FFF) { } } クラスmainCまではなんの問題もなく理解もできますし、ちゃんと動くのですが、問題はクラスquestionDで 指定されている上のメソッド(int EEE(superA[] FFF))でmainCで代入されたsuperAやsubBの変数の値を使って、その和を返せ というものなんですが まず引数にクラス配列を指定してる場合、どのようにしてmainCで呼び出せばいいのでしょうか? また、どのようにしてquestionDでsuperAやsubBのint変数を利用すればいいのでしょうか? 教えてください。よろしくお願いします。 まだjavaをはじめて間もないので間違った言葉の使い方や意味の不明な点がありましたら補足要求でお願いします。

    • ベストアンサー
    • Java
  • AWT Frameを利用するプログラムのmainメソッドを含むクラスについて

    AWTのFrameを継承してWindowプログラムを作成する際に、どんな書籍のサンプルプログラムを見ても、メインクラスがFrameを継承し、その中にmainメソッドが有って、そのmainメソッド内で自分自身のクラスのインスタンスを作成してshowする、といった事を定石のように行っています。 しかし私が思うに、mainメソッドなど含まずFrameを継承してWindow周りの処理を純粋に行うクラスを作成し、プログラムのメインとなるクラス内のmainメソッドからFrameを継承した別クラスのインスタンスを作成・showする方が、よほどスッキリして理解し易いような気がするのですが、どうなんでしょ? そういったサンプルプログラムを作成してみましたが問題なく動作します。ただそういう事をやっている他のサンプルソースが見当たらないので、何となく不安です(笑)

    • ベストアンサー
    • Java
  • 文字列の配列の比較

    こんにちは。タイトルどおり簡単な質問なのですが、どうしても確認したいのでお願いします。 とあるメソッドで、2次元配列の中にいくつか大文字のOが入ってるのですが、与えられた配列にOがあればtrueを返し、なければfalseを返します。 public boolean cellAt(int row, int col){ if(space[row][col].equals("O")) return true; else return false; } rowとcolはテストメソッドから値を受け取ります。 これでプログラム自体は動くのですが、WebCatという自動的に採点するものがあるのですが、それによるとエラーがでてしまいます・・・。 どこが違うのかは教えてくれないのですが・・・。 上で間違っているとすれば、文字列の比較くらいしかないんじゃないかと思うのですが、 space[row][col].equals("O") これで比較できますよね? 他のを調べて、if (Arrays.equals(space[row][col], "O"))これを試してもみたのですが、赤線が出てしまって無理でした。 どなたか宜しくお願いします。

  • 配列で質問があります。

    小さなプログラムを配列を作りました。 3個配列を指定しそのうち2つを返すという ようなプログラムです。 バグがでてしまいメソッドのところで出ます。 Hairetu.java:9: ';' がありません。 int[] hairetu2(int box[0],int box[1]){  エラー1 作成したプログラムは以下です。メソッドの定義など見てみたのですがなぜバグが出るのかよくわかりません。教えて下さいませんか。 class Hairetu{ public static void main (String args[]){ int[] box = new int [3]; box [0] =1; box [1] =2; box [2] =3; int[] hairetu2(int box[0],int box[1]){ return box; } hairetu2 = hairetu2(box[0],box[1]); System.out.println(box); } } ^

    • ベストアンサー
    • Java
  • メソッド宣言の戻り値の型にクラス名を使うには?

    メソッドの戻り値の型にクラス名を使ってるプログラムを見かけたのですが、例えばクラス名を public class Player{ とします。そして Playerクラスのメソッド宣言に  private   Player(戻り値の型) startRun(メソッド名) { とあります。 これは戻り値の型にクラス型の変数を使ってユーザー定義してると思うのですが使い方が分かりません。 javaのサイトはできるだけ調べたのですが戻り値の型にクラス名を使うにはどうすればいいか分かりませんでした。 この使い方を教えてくれるサイトを教えてください。 基本型と参照型のStringクラスについて教えてくれるサイトはたくさん見かけたのですが…。 お願いします。

    • ベストアンサー
    • Java
  • クラス型配列を同じクラス内関数の引数に使えますか?

    今ゲームを作成中です。クラス型の配列を引数で渡して その関数内でメンバの値を変えたいと思っています。 下記のような記述を試してみたのですがエラーは出ませんが 配列が関数内で参照できず思うようにいきません。 同じクラス内でクラス型の配列は使えないのでしょうか? その場合どのようにすれば配列でクラス内メンバの値を 保持すればよいでしょうか?ご回答お願いします。 #define Block_Max (100) Block* B Block* BB[] void main(){   for(int no=0; no < Block_Max; no++){     B->Block_Test(no,BB);   } } Block::Block_Test(int no,Block* BB[]){   BB[no]->B_Test_F = true; }

  • Stringクラスのlengthメソッドについて

    こんにちは、Stringクラスのlengthメソッドについて質問させてください。 今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。 ArrayListだとかは長さが変わるからメソッドという意識を持っていました。 (カプセル化の概念とも関わりますが) 先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。 確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。 言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。 Stringクラスのソースコードを見ていたら、文字列の長さは内部的に private int count; と宣言されていました。 そして、lengthメソッドは return count; しているだけでした。 ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、 public final int length; とすれば、良かったのでは?と思いました。 この考えについて、 それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。 よろしくお願致します。

  • 別クラスのメソッドの呼び出し

    どうしても期待した値が取れず、バイナリが返ってきてしまいます。 簡単な内容なので申し訳ないのですが書き方を教えて下さい。 下記内容です。↓ クラス01にmainメソッドを作成。 そこに「一」「二」「三」を格納する変数を宣言。 クラス02にpublic以外のメソッドを作成。 そこで「一」「二」「三」を引数として受け取り、その3つを「+」以外で文字列連結する。 クラス01のmainメソッドから、クラス02のメソッドを呼び出し、最後にSystem.out.printlnで戻ってきた文字列を出力。 ソース貼っておらず申し訳ないのですが宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう