Java初心者が困っている!NullPointerExceptionの解決方法とは?

このQ&Aのポイント
  • Java初心者がオブジェクトの配列の動作をテストしているプログラムで、NullPointerExceptionが発生してしまい困っています。
  • 該当のプログラムでNullPointerExceptionが発生する原因として、オブジェクトの配列を宣言しただけで初期化していないことが考えられます。
  • NullPointerExceptionを解決するためには、オブジェクトの配列を初期化する必要があります。具体的には、配列の要素ごとにオブジェクトを生成し、初期化することで解決できます。
回答を見る
  • ベストアンサー

java.lang.NullPointerException

java初心者です。 ******************************************* Exception in thread "main" java.lang.NullPointerException at Region2.<init>(Region2.java:7) at Region2.main(Region2.java:11) ******************************************* というエラーで困っています。 ソースは、 ******************************************* import java.io.*; public class Region2 {  public Test[] t = new Test[10];  public Region2(){   t[0].x = 1;//ココ   System.out.println(t[0].x);  }  public static void main(String[]args){   Region2 reg = new Region2();//ココ   System.out.println(reg.t[0].x);   System.exit(0);  } } class Test{  public int x;  public Test (int x){//xをセット   this.x = x;  }  public void Show () {//xを表示   System.out.println(x);  } } **************************************** 見ての通りのプログラムで、あまり意味のないものですが、オブジェクトの配列の動作をテストしています。でずが、「ココ」とコメントしたところでたたかれてしまいます。私は恥ずかしながら「え?何でダメなの?」という感じです。 何がいけないのか、もしくはどうすれば、 1 1 と表示されるか、どなたかアドバイスください。

  • arcsin
  • お礼率46% (194/417)
  • Java
  • 回答数1
  • ありがとう数24

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

今アルコール入ってるんで、 回答の妥当性はそちらでチェックしてくださいね。 これは public Test[] t = new Test[10]; のところで、「配列tができた」と思っていたところが できていなかったのが原因です。 Javaのオブジェクトというのは、宣言しただけでは使えなくて、 newしなくてはならないというのはおわかりですね? つまり、Abcというクラスがあった場合、 Abc a; だけでは使えなくて、 Abc a = new Abc(); のようにしなくてはなりません。 配列を宣言したというのは、 「配列の変数を宣言しただけ」なのです。 「Javaの配列はテーブルタップのようなもの」 というたとえがあります。 テーブルタップには、実際に使う電化製品をつながないといけません。 public Test[] t = new Test[10]; では、「配列の変数が宣言された」だけです。 具体的には、 t[0] = new Test(...); t[1] = new Test(...); ... t[9] = new Test(...); のようにします。こうしないと、配列の要素の各オブジェクトは存在しません。 (for(int i = 0; i < 10; i++){ t[i] = new Test(...); } でもいい。) t[0].x = 1; のところでは、存在しないオブジェクトのフィールドに値を代入しています。 だからエラーになります。

arcsin
質問者

お礼

とてもわかりやすい御説明、ありがとうございます。 なるほど!ともやもやしたものが一気になくなりました。 C言語でいう、ポインタは宣言したけど、肝心のポインタの中身はNULLだよといった感じだったのですね。(こんなことを言っているからなかなかオブジェクト指向になれられないのですが・・) オブジェクトを生成していないし、参照先も登録してなかったわけですよね。また何かありましたらよろしくお願いします。

関連するQ&A

  • java

    コンパイルできても、実行ができません。 次のようなエラーがでます。 このエラーはどのようなエラーなのでしょうか? Exception in thread "main" java.lang.NoClassDefFoundError: test コードはただたんにHello JAVA と表示させるだけです。 class Test{ public static void main(String args[]){ System.out.println("Hello Java\n"); } }

    • ベストアンサー
    • Java
  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • JAVAについて

    現在JAVAについて学んでいるのですが、下記のソースが実行出来ません。どなたかわかる方、回答宜しくお願いいたします。 public class Lound { void main(String[] args) { String rtn = methWithParamReturn(3); if(rtn.equals("0")) System.out.println("0あかんよ"); else System.out.println(rtn); } public String methWithParamReturn(int x) { System.out.println(x); x= x*x; String str = String.valueOf(x); return str; } }

  • javaのプログラムについて

    java始めたばかりの者です。 class sample1 { public static void main(String[] args) { for(int i=1; i<=5; i++){ for(int j=0; j<i; j++){ System.out.println("*"); } System.out.println("\n"); } } } これを実行すると * * * * * * * * * * * * * * * こうなってしまい * ** *** **** ***** このようにするにはどうしたらいいのでしょうか??

    • ベストアンサー
    • Java
  • java 戻り値についての質問です。

     戻り値を使ったプログラムを作成したところエラーが出たのですが、どこを修正しなければならないのかわかりません。 [プログラム] public class Main31{ public static int add(int x, int y){ int ans = x + y; return ans; } public static void main(String[] args){ int ans = add(100 , 10); System.out.println(x +"+"+y+"="+ans); } } [エラーの内容] Main31.java:12: エラー: シンボルを見つけられません System.out.println(x +"+"+y+"="+ans);     ^ シンボル: 変数 x 場所: クラス Main31 Main31.java:12: エラー: シンボルを見つけられません System.out.println(x +"+"+y+"="+ans);      ^ シンボル: 変数 y 場所: クラス Main31 エラー2個 どこを直せば良いのかと、このプログラムだとエラーが出てしまう理由を教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaについて

    以下のようにキーボードから入力していくプログラムを試行しているのですが、エラーが出てくるので行き詰まっています。 理想的にはキーボードに”あいう”エンター”えおか”エンターと打ち込んだら str[0]=あいう str[1]=えおか と表示させていきたいのですが、よろしくお願いします。 import java.io.*; import java.lang.*; import java.net.*; import java.awt.*; class gugu2 { public static void main(String[] args) throws IOException { int i=0; while(i<2){ System.out.println("キーワード入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine(); char str[] = input.toCharArray(); System.out.println("キーワードは" + str[]); i=i+1; } for(i=0;i<2;i++){ System.out.println(str[]); } } } これがエラー表示です。 gugu2.java:17: '.class' がありません。 System.out.println("キーワードは" + str[]); ^ gugu2.java:21: '.class' がありません。 System.out.println(str[]); ^ エラー 2 個

    • ベストアンサー
    • Java
  • Javaの初歩

    変数のスコープみたいなものが、いまだに良く分かって ないみたいなんです。このプログラムを実行すると、 15 0 20と表示されるのですが、最後がなぜ15ではなく て、20なのかがなかなか分かりません。どなたか教えて 頂けませんでしょうか。お願いします。 class Value { public int i = 15; } public class Test { public static void main(String argv[]) { Test t = new Test(); t.first(); } public void first() { int i = 5; Value v = new Value(); v.i = 25; second(v, i); System.out.println(v.i); } public void second(Value v, int i) { i = 0; v.i = 20; Value val = new Value(); v = val; System.out.println(v.i + " " + i); } }

    • ベストアンサー
    • Java
  • java 入力命令

    以下うまくどうさしません、教えてください。 public class Main { public static void main(String[] args){ System.out.println("名前"); String name = new java.util.Scanner(System.in) .nextLine(); System.out.println("年齢"); int age = new java.util.Scanner(System.in) .nextInt(); System.out.println (age + name); } }

  • java 初心者です

    javaの勉強しようと思い、ゲームを作ることになったのですが、画像が表示されなくて困っています。 構想としてはメインクラスからフレームクラス(gameFrame)を呼び出し、フレームクラスから画像表示クラス(Layer)を呼び出したいのですが、 Exception in thread "main" java.lang.NullPointerException at Layer.paint(Layer.java:25) at Layer.<init>(Layer.java:17) at gameFrame.newLayer(gameFrame.java:25) at main.main(main.java:9) というエラーが出てうまくいきません。 下記にLayerクラスを載せるのでお願いします。 import java.awt.*; import javax.swing.*; public class Layer extends JPanel{ int x=0; int y=0; private static final long serialVersionUID = 1L; Image image = null; Layer(String img,int X,int Y){ image=roadImage(img); setVisible(true); x=X; y=Y; paint(this.getGraphics()); } public void paint(Graphics g){ System.out.println("ペイント"); System.out.println(image); g.drawImage(image,x,y,this); System.out.println("ペイント終わり"); } static Image roadImage(String path){System.out.println("イメージセット"); if(path == null){ System.out.println("pathはnullです"); } System.out.println("pathは"+path+"です。"); Toolkit kit = Toolkit.getDefaultToolkit(); return kit.getImage(path); } }

  • javaの問題

    import java.util.Scanner; class test6{ static void printArray(int[] a) { for(int i=0;i<a.length;i++) System.out.print(String.format("%1$6s", (a[i]+" "))); System.out.println(); } static void printArray(int[][] a) { for(int[] i:a) { for(int j:i) System.out.print(String.format("%1$6s",(j+"\t"))); System.out.println(); } } public static void main(String[] args) { int[] a = {12,536,-8,7}; int[][] c = {{32,-1,32,45,67}, {535,99999,2}, {2,5,-123,9}}; printArray(a); printArray(c); } } このプログラムを表示するとこのようになるのですが、 12 536 -8 7 32 -1 32 45 67 535 99999 2 2 5 -123 9 これに一工夫加えて見やすくしたいです。 このような形にするのはどのようにすればよいのでしょうか + + | 32 -1 45 67 | | 535 99999 2 | | 2 5 -123 9 | + +

専門家に質問してみよう