miroCyber 2023-04-06 23:45 采纳率: 40%
浏览 36
已结题

Java 非主函数调用其他类的方法,对象报错为null

import java.util.Random;
import java.util.Scanner;
import java.util.regex.Pattern;

public class DartGame
{

private  int dartsNumber;
public Player player;


public DartGame()
{
    dartsNumber=0;
}

public DartGame(int dartsNumber) {
    this.dartsNumber = dartsNumber;

}

public int getDartsNumber() {
    return dartsNumber;
}

public void setDartsNumber(int dartsNumber) {
    this.dartsNumber = dartsNumber;
}



public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    DartGame game1 = new DartGame();
    Player player = new Player();
    game1.displayWelcomeMessage();
    String name = game1.inputUserName();
    System.out.println("your name is "+name);
    //put the name into the class of player
    player.setName(name);
    System.out.println("getName========"+player.getName());
    //call the method of inputDartsNumber
    int dartNum = game1.inputDartsNumber();
    System.out.println("your input number of dart = "+dartNum);
    //
    game1.setDartsNumber(dartNum);

    while (true){
        System.out.println("Do you want to start the game? please enter Yes to Start or No to quit the game");
        String isStart = scanner.nextLine();
        //The equalsIgnoreCase() method is used to compare the string with the specified object, regardless of case.
        if(isStart.equalsIgnoreCase("Yes") )
        {
            System.out.println("Welcome to the Darts Game!");
            //initialize field
            player.setPlayerScore(0);
            player.setVaderScore(0);
            boolean isContinue = game1.playGame();
                if(isContinue==false)
                {
                        System.out.println("Bye bye");
                        break;
                }
                else if(isContinue ==true)
                {
                        continue;
                }

        }
        else if(isStart.equalsIgnoreCase("No"))
        {
            System.out.println("Bye bye");
            break;
        }
        else
        {
            System.out.println("Invalid input, please enter agian");
        }
    }
}

public void displayWelcomeMessage()
{
    System.out.println("Welcome to the Game!");
}

public String inputUserName()
{
    Scanner scanner = new Scanner(System.in);
    while(true)
    {
        System.out.print("Please enter your name: ");
        String yourName = scanner.nextLine();
        if(isSmall(yourName) && yourName.length()<=8)
        {
            System.out.println("input correctly");
            return yourName;
        }
        else
        {
            System.out.println("Please enter no more than eight lowercase letters,please enter agian");
        }
    }

}


public int inputDartsNumber()
{
    Scanner scanner = new Scanner(System.in);
    while (true){
        System.out.println("Please enter the number of darts you need,the number of darts must between 1 and 5.\nplease enter here:");
        String darts =scanner.nextLine();
        //Used to determine whether the character is a number
        //*******
        if(isDigits(darts) && darts.length()!=0)
        {
            int dartNumber = Integer.parseInt(darts);

            if(0<dartNumber  && dartNumber<=5)
            {
                return dartNumber;
            }
            else
            {
                System.out.println("Invalid input,You can only have 1 to 5 darts");
            }
        }
        else
        {
            System.out.println("Invalid input,You can only have 1 to 5 darts");
        }
    }
}

public boolean isSmall(String name)
{
    Pattern pattern = Pattern.compile("[a-z]*");
    return pattern.matcher(name).matches();
}

public boolean isDigits(String darts)
{
    Pattern pattern = Pattern.compile("[0-9]*");
    return pattern.matcher(darts).matches();
}


public void calculateScore(int score,String identity)
{
    if(identity.equalsIgnoreCase("player"))
    {
        int totalPlayerScore = player.getPlayerScore()+score;
        player.setPlayerScore(totalPlayerScore);
    }
    else if(identity.equalsIgnoreCase("vader"))
    {
        int totalVaderScore = player.getVaderScore()+score;
        player.setVaderScore(totalVaderScore);
    }

}

public void displayResultOfDartThrow(int dartNumber, int score)
{
}

public String displayGameResult(int playerScore,int dartScore)
{
    if(playerScore>dartScore)
    {
        return "player winning";
    }
    else if (playerScore<dartScore)
    {
        return "Vader winning";
    }
    else if(playerScore==-1)
    {
        return "Vader winning";
    }
    else if(dartScore== -1)
    {
        return "player winning";
    }
    else {
        return "draw";
    }
}

public boolean playGame()
{

    Scanner scanner = new Scanner(System.in);
    Random random = new Random();
    DartThrow dartThrow = new DartThrow();
    int dartsThrown = 1;

    while (true && dartsThrown<(getDartsNumber()+1)) {
        // human player's turn
        System.out.println("Your turn to throw. Type 'quit' to abandon the game.");
        String input = scanner.nextLine();
        if (input.equalsIgnoreCase("quit"))
        {
            System.out.println("You abandoned the game.");
            System.out.println("the result of the game is "+displayGameResult(-1,0));
            return true;
        }

        double playerBoard = dartThrow.generateRandomNumber(100);
        if (playerBoard < (Math.PI / 4*100)) {
            // dart lands on the board
            dartsThrown++;
            double playerThrow = dartThrow.generateRandomNumber(100);
            if (playerThrow < 4) {
                // dart lands in black area
                System.out.println("You got 5 points!");
                calculateScore(5,"player");
                System.out.println("your current total score = " + player.getPlayerScore());
            } else if (playerThrow < 16) {
                // dart lands in yellow area
                System.out.println("You got 2 points!");
                calculateScore(2,"player");
                System.out.println("your current total score = " + player.getPlayerScore());
            } else {
                // dart lands in blue area
                System.out.println("You got 1 point!");
                calculateScore(1,"player");
                System.out.println("your current total score = " + player.getPlayerScore());
            }
        } else {
            // dart misses the board
            dartsThrown++;
            System.out.println("You missed the board. Zero points scored.");
            System.out.println("your current total score = " + player.getPlayerScore());
        }

        // Dart Vader's turn
        if (dartThrow.generateRandomNumber(100) < 5) {
            // Dart Vader abandons the game
            System.out.println("Dart Vader abandoned the game.");
            System.out.println("the result of the game is "+displayGameResult(0,-1));
            return true;
        }

        double VaderBoard = dartThrow.generateRandomNumber(100);
        if (VaderBoard < (Math.PI / 4*100)) {
            // dart lands on the board
            double VaderThrow= dartThrow.generateRandomNumber(100);
            if (VaderThrow < 4) {
                // dart lands in black area
                System.out.println("Dart Vader got 5 points.");
                calculateScore(5,"vader");
                System.out.println("Dart Vader's current total score = " + player.getVaderScore());
            } else if (VaderThrow < 16) {
                // dart lands in yellow area
                System.out.println("Dart Vader got 2 points.");
                calculateScore(2,"vader");
                System.out.println("Dart Vader's current total score = " + player.getVaderScore());
            } else {
                // dart lands in blue area
                System.out.println("Dart Vader got 1 point.");
                calculateScore(1,"vader");
                System.out.println("Dart Vader's current total score = " + player.getVaderScore());
            }
        } else {
            // dart misses the board
            System.out.println("Dart Vader missed the board. Zero points scored.");
            System.out.println("Dart Vader's current total score = " + player.getVaderScore());
        }
    }

    System.out.println("!!!!!!Game over!!!!!!");
    System.out.println("Your score: " + player.getPlayerScore());
    System.out.println("Dart Vader's score: " + player.getVaderScore());
    System.out.println("the result of the game is "+displayGameResult(player.getPlayerScore(),player.getVaderScore()));
    return true;
}

}

Java 非主函数调用其他类的方法,对象报错为null,如果我在其他方法下面再new Player对象,那么
就会被回收,get不到值。
报错信息如下:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Player.getPlayerScore()" because "this.player" is null
at DartGame.calculateScore(DartGame.java:152)
at DartGame.playGame(DartGame.java:227)
at DartGame.main(DartGame.java:57)

  • 写回答

2条回答 默认 最新

  • Mini厂程序员 2023-04-06 23:48
    关注

    题主的意思是player是null?把main方法里面的Player player = new Player()删除,然后把第二行的public Player player改成private static Player player = new Player()就可以了
    因为静态方法里面无法访问非静态变量,所以main方法的player对象和外面的不是同一个,main方法set的值也只是在main方法用上了,还有一种方式是把player对象作为一个参数传到方法里面去,就可以拿得到main方法里面set的值了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月14日
  • 已采纳回答 4月6日
  • 修改了问题 4月6日
  • 修改了问题 4月6日
  • 展开全部

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改