• ベストアンサー

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

こんばんは。 自分で作ったクラスのメソッドで、戻り値が配列のメソッドがあります。そのメソッドをメインプログラムから呼び出しても、値が入っていません。(空の配列が返ってくるのか、配列が返されているのかも分かりません)実行時エラーは以下の通りです。 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; } 本などを見ても、構文的に間違いはないと思うんですが。。 だれか、原因の思いつく方は解答をください。よろしくお願いします。

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

  • ベストアンサー
  • 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