-2

オブジェクト指向のマスターマインド ゲームを作成しています。すべてのクラスとメソッドをセットアップし、非オブジェクト指向プログラミング スタイルで試してみましたが、すべて動作しましたが、オブジェクト指向スタイルで使用しているため、null ポインター エラーが発生します。エラーが発生している場所がわかり、null値とは何か、または何が問題なのかを突き止めようとしましたが、わかりません。また、同様の型式で別の null 例外を取得するためだけに null が発生するポイントを取り出してみました。したがって、メソッドなどを呼び出すための構文が間違っていると思いますが、それを修正する方法や、それが実際のエラーの原因であるかどうかはわかりません。

2 番目のコード ブロックは、直接ジャンプする場合にエラーが発生する場所です。

私はここにたくさんのものを投稿したことを知っているので、明確化が必要な場合は喜んでお手伝いします. 主な焦点は単に null エラーであるため、表示される他のエラーがある場合は、null エラーの解決を妨げない限り無視してください。

読みやすいように各クラスを分けました。


public class GameTester {

public static void main(String[] args) {

    MasterMind m = new MasterMind();
    m.playGame();
    }
}

public class MasterMind 
{
private Master theMaster;
private Player thePlayer;

public void mastermind() {
    theMaster = new Master();
    thePlayer = new Player();
}

public void playGame() {
    System.out.println("WELCOME TO CODEBREAKER... Let's Play!\n");
    System.out.println("Guess a 4-letter code with letters A, B, C, and D\n");

    theMaster.createCode(); //heres where the null exception is said to occur

    while(true) {
        thePlayer.makeGuess(); //if i remove the call above this becomes null error
        int x = theMaster.totalCorrect(thePlayer.getGuess());
        if( x == 4) {
            System.out.println("\nGOT IT!!!\n");
        }
        else {
            System.out.printf("MISSED! %d out of 4. TRY AGAIN... \n", x);
        }       
    }
 }

  import java.util.Random;
  public class Master 
  {
  private char[] Code = new char[4];

public Master()
{

}

public void createCode()
{
     Random R = new Random();
        char[] setting ={'A', 'B', 'C', 'D'}; 
        int rx;

        for(int i=0; i<=3; i++)
        {
            rx = R.nextInt(4);
            Code[i] = setting[rx];
        }           
}

public int totalCorrect(char[] theGuess)
{
    int x =0;

    if(Code[0] == theGuess[0]) {
        x++;
    }   
    if(Code[1] == theGuess[1]) {
        x++;
    }
    if(Code[2] == theGuess[2]) {
        x++;
    }
    if(Code[3] == theGuess[3]) {
        x++;
    }

    return x;
}
}

 import java.util.Scanner;
 public class Player { 

 private char[] Guess = new char[4];

public Player() {

}

public void makeGuess() {

    System.out.println("YOUR GUESS => ");
    Scanner input =new Scanner(System.in);
    String guess = input.next(); 
    char[] D = guess.toCharArray(); 

    for(int i=0; i<4; i++) {
        Guess[i] = D[i];
    }   
}

public char[] getGuess() {
        return Guess;
}   
}
4

3 に答える 3

6

コンストラクターはまったく同じクラスで、戻り値の型がない必要があります。それ以外の場合は、メソッドとして扱われ、オブジェクトのインスタンス化で実行されず、theMaster参照が を指すままになりnullます。

 MasterMind () 
{
    theMaster = new Master();
    thePlayer = new Player();

}
于 2012-10-18T17:49:55.987 に答える
3

final on 属性宣言を使用すると、インスタンスのライフサイクルが強制され、コンストラクターは必要ありません。

public class MasterMind 
{
   private final Master theMaster = new Master();
   private final Player thePlayer = new Player();
于 2012-10-18T17:53:43.993 に答える
0

-まずconstructor、 の名前ClassNo return typeの が必要です。

- Amethodは と同じ名前にすることができclassますが、 return type .

次のようなことを試してください:

MasterMind () 
{
    theMaster = new Master();
    thePlayer = new Player();

}
于 2012-10-18T17:53:37.843 に答える