2016-09-05 10 views
0

まずは、読んでいただきありがとうございます!カスタムサブクラスのインスタンスを作成中にNullReferenceを取得する

私はPhoneというスーパークラスを作成し、LG、Samsung、Huaweiの3つのサブクラスを作成しました。私はこのMVCスタイルをやろうとしていたので、コントローラパッケージに行ってコードをテストし、作成したすべてのクラスをインポートして、どのサブクラスを作成するかを指定するStringを入力してインスタンス化できました。 プログラムを実行して名前を正しく入力した後、NullReferenceを取得しました。私はデバッグを開いて、 'p'(ループに使用された変数)がインスタンス化されていないことを発見しました。

どのように表示されますか?どんな助けでも大歓迎です!

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    Phone[] phones = new Phone[3]; 
    for(Phone p : phones){ 
     System.out.println("What brand?"); 
     String inputBrand = scan.nextLine(); 
     switch(inputBrand) { 
     case "LG" : p = new LG(); 
      break; 
     case "Samsung" : p = new Samsung(); 
      break; 
     case "Huawei" : p = new Huawei(); 
      break; 
     default : System.out.println("You're an idiot"); 
      break; 
     } 
    } 
    for(Phone p : phones){ 
     System.out.println(p.toString()); 
    } 
    scan.close(); 
} 
+0

'System.out.println("あなたはばかだよ ");' –

答えて

0

その行が配列をインスタンス化しますが、その内容をインスタンス化しない:あなたが使用している

Phone[] phones = new Phone[3]; 

foreachのは、配列ではなく、そのサイズの内容をチェックし、イテレータ、に基づいており、あなたが期待する通り。ループ内でスコープされる一時変数にではなく、携帯電話へ

p = new LG() 

この行は、新しいLGを(割り当て)[i]は、あなたの意図があったように。

私はあなたのオブジェクトを格納するためのリストを使用することをお勧め:

private static final int LOOPS = 3; 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    List<Phone> phones = new ArrayList<>(); 
    for(int i = 0; i < LOOPS; i++){ 
     System.out.println("What brand?"); 
     String inputBrand = scan.nextLine(); 
     switch(inputBrand) { 
      case "LG" : phones.add(new LG()); 
       break; 
      case "Samsung" : phones.add(new Samsung()); 
       break; 
      case "Huawei" : phones.add(new Huawei()); 
       break; 
      default : System.out.println("Your code is less than optimal"); 
       break; 
     } 
    } 
    for(Phone p : phones){ 
     System.out.println(p.toString()); 
    } 
    scan.close(); 
} 
0

あなたが代わりに行う必要があります。

for (int i = 0; i < phones.length; i++) { 

     System.out.println("What brand?"); 
     String inputBrand = scan.nextLine(); 
     switch (inputBrand) { 
     case "LG": 
     phones[i] = new LG(); 
     break; 
     etc etc 

をので、あなたが他の場合、あなたには、配列の要素にアクセスすることができますので、電話のコピーを設定しているので、配列がそのまま宣言されたままになります... therfore NPE

+0

e forループを拡張して配列を反復処理し、配列を変更しないでください。 –

+0

正確に。 foreachの仕組みを確認してください:http://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work –

関連する問題