2016-07-17 6 views
0

私はバグを検索しようとしていましたが、見つけられませんでした。間違ったことを解決しようと既に1時間を費やしました。エラーは、コードがisPlayerSetメソッドwhile (!player.isPlayerSet()) {に入ると開始されます。私は既に使用されているプロパティを ""設定しましたが、このnullpointerexeptionエラーが発生しています。私はプログラミング、特にJavaでかなり新しいことを理解してください。String.isEmpty()からの永続的なjava.lang.NullPointerExceptionエラー

ここでここでの主なクラスが

public class Main { 
    public static void main(String[] args) { 
     Scanner scanner = new Scanner(System.in); 

     String playerName = ""; 
     int chosenPokemon = 0; 
     boolean isANumber = false;; 
     Player player; 

     /* 
     * Initialize Players 
     */ 
     Player[] players = new Player[2]; 

     for (int counter = 0; counter < players.length; counter++) { 
      player = new Player(); 
     } 

     /* 
     * Get details of trainers 
     */ 
     for (int counter = 0; counter <= players.length-1; counter++) { 
      player = players[counter]; 
      while (!player.isPlayerSet()) { 
       /* 
       * Input player name 
       */ 
       if(player.getPlayerName() == "") { 
        System.out.println("Enter a valid name for Player " + (counter+1) + ":"); 
        player.setPlayerName(playerName); 
       } 
       /* 
       * Choose Pokemon 
       */ 
       if(player.getChosenPokemon() == ""){ 
        System.out.println("Choose a starting pokemon for Player " + (counter+1) + ":"); 
        System.out.println("[1] Charmander"); 
        System.out.println("[2] Bulbasaur"); 
        System.out.println("[3] Squirtle"); 

        do { 
         if(!scanner.hasNextInt()) 
         { 
          System.out.println("Input must be a valid integer. Try Again."); 
          scanner.next(); 
         } 
         else if(!(chosenPokemon >= 1) && !(chosenPokemon <= 3)) 
         { 
          System.out.println("Input must be a number from 1-3. Try Again."); 
          scanner.next(); 
         } 
         else { 
          chosenPokemon = scanner.nextInt(); 
          isANumber = true; 
         } 
        } while(!isANumber); 
        player.setChosenPokemon(chosenPokemon); 
       } 
      } // End of while loop 
     } // End of for loop 
    } 
} 

だとプレイヤークラスは

public class Player { 
    Scanner scanner = new Scanner(System.in); 

    private String playerName = ""; 
    private String chosenPokemon = ""; 

    public String getPlayerName() { 
     return this.playerName; 
    } 

    public void setPlayerName(String playerName) { 
     do { 
      playerName = scanner.nextLine(); 
      if(!isAlpha(playerName)) { 
       System.out.println("Invalid input. Try again"); 
      } 

      if(playerName.isEmpty()) { 
       System.out.println("Player name cannot be blank! Try again"); 
      } 
     } while(!isAlpha(playerName) || playerName.isEmpty()); 

     this.playerName = playerName; 
     System.out.println("Welcome " + this.playerName); 
    } 

    public String getChosenPokemon() { 
     return chosenPokemon; 
    } 

    public void setChosenPokemon(int chosenPokemon) { 
     if(chosenPokemon == 1) { 
      this.chosenPokemon = "Charmander"; 
     } else if(chosenPokemon == 2) { 
      this.chosenPokemon = "Bulbasaur"; 
     } else { 
      this.chosenPokemon = "Squirtle"; 
     } 
    } 

    public boolean isPlayerSet() { 
     if (this.playerName.isEmpty() && this.chosenPokemon.isEmpty()) { 
      return false; 
     } 

     return true; 
    } 

    public static boolean isAlpha(String name) { 
     char[] chars = name.toCharArray(); 

     for (char c : chars) { 
      if (!Character.isLetter(c)) { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

だ私はまた別の質問があり、それがPlayer playerplayers[counter]を交換することをお勧めしますか?

+0

代わりに「プレーヤー」を追加するつもりは? –

+0

Playerクラスのプレーヤー変数をオブジェクトデータ型として宣言しました。私はそれを変数に入れたいと思っていました。したがって、player [counter] .someMethodと入力する代わりに、player.someMethodを実行します。それが意味をなさないならば。私はそれがプログラムのパフォーマンスに影響を与えるかどうか疑問に思っていました。私はコードを単純化する方法を学ぼうとしています。 – Wax

+0

配列 "選手"の意図は何ですか? –

答えて

3

あなたは新しいプレーヤーを作成しているが、ここでオブジェクト:

for (int counter = 0; counter < players.length; counter++) { 
    player = new Player(); 
} 

しかし:あなたははあなたが上記で定義された配列にそれらのプレーヤーを格納していませんが。したがって、配列要素は初期値のままです。つまり、配列内のすべてのプレイヤーがnullであることを意味します。

だからあなたのループが

players[counter] = new Player(); 

を言うべきそしてもちろん、あなたが本当にこのhereを読むことをお勧めします。

+0

オハイオ州の男、私は 'player player 'という変数を宣言して、' player [counter]'をすべて置き換えました。そして、うまくいきました。多分、そのコード行を乱してバグを作り出したキーを押したのかもしれません。 とにかく 'player player'変数の中に' player [counter] 'を置くことをお勧めしますか? ありがとう! – Wax

+0

申し訳ありませんが、コードをスキャンするのではなく、エラーメッセージに集中しました。 – Wax

+0

そこに1つのコメント:それを避けるようにしてください。 A)たくさんのコードを書いてコンパイルして実行しないでください。代わりに、 "意味のある"ものを一緒に引っ張ってすぐにコンパイル/実行してみてください。 B)実行中のプログラムを変更するときは、完全に新しいファイルを作成するほうがいい。あなたは戻って、あなたが行った変更をチェックすることができます。物事が "壊れた" ... "突然"。 – GhostCat

2

このループ内で同じ変数をクローバーしています。

for (int counter = 0; counter < players.length; counter++) { 
    player = new Player(); 
} 

オプション1:

for (int counter = 0; counter < players.length; counter++) { 
     players[counter] = new Player(); 
    } 

オプション2(わずかにより簡潔且つエレガント):ループで

for (Player p: players) p = new Player(); 
2

for (int counter = 0; counter < players.length; counter++) { 
    player = new Player(); 
} 

ローカル変数playerを初期化します、したがってwhile (!player.isPlayerSet())playerは、nullです。あなたはこの

for (int counter = 0; counter < players.length; counter++) { 
    player = new Player(); 
} 

は、このする必要がありますplayers配列

for (int counter = 0; counter < players.length; counter++) { 
    players[counter] = new Player(); 
} 
1

でインスタンスを初期化する必要があります。

for (int counter = 0; counter < players.length; counter++) { 
    players[counter] = new Player(); 
} 
+0

アイデアは、「これは作業コードです」を投稿する以上のことです。あなたはいつもあなたの答えがうまくいく**理由を説明します。 – GhostCat

+0

@Jägermeister100%があなたに同意します。そして、この場合は、論理を知らない(まっすぐ真っ直ぐ)こと以外にも、間違った理由はちょっと不注意(プレイヤーとプレイヤーの間で混乱する)でした。だから、答えはおそらく何がうまくいかないかを知るのに十分なはずです。 :) –

関連する問題