-1

コード レビュー (stackexchange) にレビュー用のプログラムを投稿しました。すべてうまくいきました。家に帰った後、IDE を使うように言われました。

ソースを Eclipse IDE で開いたところ、実行時に (IDE 上またはなしの両方で) このエラーが発生し始めました。

Exception in thread "main" java.lang.NullPointerException
        at games.Spin.rand(Spin.java:68)
        at games.Spin.<init>(Spin.java:10)
        at games.GameHandler.<init>(GameHandler.java:8)
        at Mains.startGame(Mains.java:16)
        at Mains.main(Mains.java:9)

なぜそれをしているのですか?私の仲間は私のコードを見直しましたが、何か問題は見つかりませんでしたか?.

私はJavaが初めてで、OOをさらに深くしようとしました。

私のコードはコード レビュー スレッドにあります (3 クラス):

https://codereview.stackexchange.com/questions/28197/improving-my-Java-object-directional-review

それの何が問題なのですか?なぜその例外が私に与えられるのですか?

68 行目:return r.nextInt(x);

    public int rand(int x) {
        return r.nextInt(x);
    }

それが私がrオブジェクトを作成する方法です:

    /**
    * Creating new Random object.
    **/

    private Random r = new Random();

Mains.java:

ゲームをインポートします。java.util.Scanner をインポートします。java.io.* をインポートします。

public class Mains {

    public static void main (String[] args) {
        //Start the game
        startGame();

    }

    private static void startGame() {

        //Declares
        GameHandler handler = new GameHandler();
        Scanner console = new Scanner(System.in);   
        boolean game = true;
        String input = "";  

        //Print program welcome text
        handler.printStart();

        //While in game...
        while (game) {
            //Getting input ready for new commands from the player
            input = console.nextLine();

            //Checking if input was set.
            if (input != null) {
                //Selecting the game you want to play.
                handler.selectGame(input);

                //If game was selected.. then.. let's start playing.
                while (handler.inGame) {
                    //Use will say something.
                    input = console.nextLine();

                    //If it was "exit", it will go back and select another game.
                    if (input.equals("exit")) {
                        handler.exitGame();
                    } else {
                        //Play again.
                        handler.continueGame(input);
                    }
                }
            }
        }
    }
}

GameHandler.java:

パッケージゲーム; java.io.* をインポートします。

public class GameHandler {

    private String[] games = {"Spin", "Tof"};
    private String[] navigation = {"Back", "Start"};
    private Spin spin = new Spin();
    private boolean spinGame = false;
    private boolean tofGame = false;
    public boolean inGame = false;

    /**
    * Method printStart
    *
    * Will welcome the player to the program.
    */
    public void printStart() {

        this.print(0, "Welcome to the program!");
        this.print(0, "Please select a game: " + this.availableGames());

    }

    /**
    * Method available games
    *
    * This will print all the games that are located in the games array in one row.
    **/

    private String availableGames() {
        String names = "";
        for (int i = 0; i < games.length; i++) {
            names = (names + games[i]);
            if (i < games.length -1) {
                names = (names + ", ");
            }
        }

        return names;
    }

    /**
    * Method selectGame
    *
    * This will select the given game.
    * @param command The entered command.
    **/

    public void selectGame(String command) {
        if (this.inArray(command))
        {
            if (command.equalsIgnoreCase("spin")) {
                this.startGame("spin");
            } else if (command.equalsIgnoreCase("tof")) {
                this.startGame("tof");
            }
        } else {
            this.print(0, "Could not find game!");
        }
    }

    /**
    * Method inArray
    *
    * This will check if the entered game name is exisiting in the games array.
    * If yes, will return a boolean true, else false.
    *
    * @param value The entered game name.
    * @return boolean true/false.
    **/

    private boolean inArray(String value) {
        int returning = 0;
        for (String s : games) {
            if (value.equalsIgnoreCase(s)) {
                returning = 1;
            }
        }
        if (returning == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
    * Method startGame
    *
    * Will start the game, and print instructions.
    * will set the game boolean to true.
    **/

    private void startGame(String game) {
        switch (game) {
            case "spin":
                this.print(0, "Welcome to spin game!");
                this.print(0, "Please click on any key to spin!");
                spinGame = true;
            break;
            case "tof":
            break;
        }

        inGame = true;
    }

    /**
    * Method continueGame
    *
    * Will continue the game, either spin again, or print new question or even answer.
    * @param command The entered command.
    **/
    public void continueGame(String command) {
        while (inGame) {
            if (spinGame) {
                this.spinWheel();
                // Break out of the loop.
                break;
            }
        }
    }

    /**
    * Method exitGame
    *
    * Exit the game..
    **/

    public void exitGame() {
        spinGame = false;
        tofGame = false;
        this.printStart();
    }

    /**
    * Method spinWheel
    *
    * This will spin the wheel.
    **/

    private void spinWheel() {
        this.print(0, spin.spinWheel());
    }

    /**
    * Method print
    *
    * Prints text using System.out
    * @param type printing type (Println/print).
    * @param message The message
    **/

    private void print(int type, String message) {
        switch (type) {
            case 0:
                System.out.println(message);
            break;
            case 1:
                System.out.print(message);
            break;              
        }
    }
}

Spin.java:

パッケージゲーム; java.util.Random をインポートします。

public class Spin {

    /**
    * The base auth we are going to work with..
    **/

    private int auth = this.rand(1000) / 5; 

    /**
    * Creating new Random object.
    **/

    private Random r = new Random();

    /**
    * Method spinWheel
    *
    * Spins the damn wheel..
    * @return spinned value + if you won or not.
    **/

    public String spinWheel() {
        return this.spinWheel(this.rand(100));
    }

    /**
    * spinWheel
    *
    * Returning results.
    **/

    private String spinWheel(int number) {

        int result = this.Calculate(this.rand(number));

        if (result < 101) {
            return "You have won the game!" + result;
        } else {
            return "You've lost the game!" + result;
        }
    }

    /**
    * Method calculate
    *
    * Calculates the spin.
    * @return the spinned number.
    **/


    private int Calculate(int Number) {

        int var = this.rand(101);

        int holder = (var * Number) / 2;

        return holder + this.auth;
    }

    /**
    * Shortcut for nextInt of Random
    **/

    public int rand(int x) {
        return r.nextInt(x);
    }

}
4

5 に答える 5

4

randRandomインスタンスrが初期化される前に呼び出されます。順序を入れ替えるか、これらの 2 つのステートメント

private int auth = this.rand(1000) / 5; 
private Random r = new Random();

する必要があります

private Random r = new Random();
private int auth = this.rand(1000) / 5; 
于 2013-07-06T21:34:14.923 に答える
2

Spinwheel クラス定義の最初に r の割り当てを行います。つまり、this.rand(1000) で使用される前に配置します。

public class Spin {
  /**
   * Creating new Random object.
   **/
  private Random r = new Random();

  /**
   * The base auth we are going to work with..
   **/
  private int auth = this.rand(1000) / 5; 
于 2013-07-06T21:33:27.513 に答える
1

rは null であるため、 でインスタンス メソッドを呼び出すことはできませんr。必ず初期化してからごr利用ください。

より具体的には、次の行で:

private int auth = this.rand(1000) / 5; 

r が初期化される前にメソッドを呼び出しrand()ています (直後に初期化されます)。

于 2013-07-06T21:31:41.353 に答える
1

これは、次の原因となる行NullPointerExceptionです。

private int auth = this.rand(1000) / 5; 

この行はの初期化の前にあるため、初期化されるrに呼び出しています。その場合は、あなたの例外です。rand rrnullrand

これは、スタック トレースから明らかです。

at games.Spin.rand(Spin.java:68)
at games.Spin.<init>(Spin.java:10)

初期化子で例外が発生していることに注意してください。そこから、何が起こっているのかを簡単に取り消すことができます。

r最初に初期化する必要があります。つまり、 の初期化行をrの初期化行の前に移動しますauth。したがって:

private Random r = new Random();
private int auth = this.rand(1000) / 5; 
于 2013-07-06T21:34:06.430 に答える
1

これは、rstatement 内でインスタンス化される前に が使用されているためですprivate int auth = this.rand(1000) / 5;。そのため、JVM は と見なしてrおりnull、これが につながっていNPEます。クラス内でこの問題を取り除くにはSpin、次のようにフィールドを宣言します。

    private Random r = new Random();
    private int auth = this.rand(1000) / 5; 
于 2013-07-06T21:34:54.827 に答える