繁体   English   中英

为什么打印为NULL?

[英]Why is this printing NULL?

我想知道是否有人可以告诉我为什么运行此命令并设置名称时得到输出“ NULL”。 我已经完成了一个从setName返回名称的return方法,但它仍显示为null,好像尚未设置它们一样。

应该发生的是-运行主菜单-设置名称-然后在gameBoard.java中运行Play方法并在其中看到名称-但我只能看到null。

主类:

import java.lang.reflect.Array;
import java.util.Random;
import java.util.Scanner;

public class main {


    public static void main(String[] args) {

        setName SN = new setName();
        gameBoard GB = new gameBoard();
        Scanner user_input = new Scanner(System.in);
        int mainMenuChoice = 0;
        String p1Name = null;
        String p2Name = null;

        while(mainMenuChoice >= 0 && mainMenuChoice < 3){

            if(mainMenuChoice == 0){
                if(p1Name != null){
                    System.out.println("Welcome " + p1Name + " and " + p2Name + " to AQADo! ");
                }
                System.out.println("MAIN MENU");
                System.out.println("1. Enter Player Names");
                System.out.println("2. Play Game");
                System.out.println("3. Quit");
                System.out.println("Select your number");
                mainMenuChoice = Integer.parseInt(user_input.next());
            }
            if(mainMenuChoice == 1){
                p1Name = SN.setName1();
                p2Name = SN.setName2();
                mainMenuChoice = 0;
            }
            if(mainMenuChoice == 2){
            int menu = 1;
            int[] p1score = {};
            Random rn = new Random();
                GB.board();
                GB.play();
                String test = user_input.next();
                for(int i = 0; i < 50; i++){
                    p1score[0] = rn.nextInt(6);


                mainMenuChoice = 0;

            }

        }


    }



    }
}

setName类:

    import java.util.Scanner;

public class setName {
    public String GlobalP1;
    public String GlobalP2;


    public String setName1(){
        Scanner user_input = new Scanner(System.in);
        String p11Name;
        System.out.println("Enter the first players name:");
        p11Name= user_input.next();
        GlobalP1 = p11Name;

        return p11Name;
    }
    public String setName2(){
        Scanner user_input = new Scanner(System.in);
        String p22Name;
        System.out.println("Enter the second players name:");
        p22Name= user_input.next();
        GlobalP1 = p22Name;


        return p22Name;
    }
    public String GBName(){
        return GlobalP1;
    }
    public String GBName2(){
        return GlobalP2;
    }
}

gameBoard类:

public class gameBoard {

    setName SN = new setName();

    char[] array1 = new char[11];{
    array1[0] = 'x';
    array1[1] = 'x';
    array1[2] = 'x';
    array1[3] = 'x';
    array1[4] = 'x';
    array1[5] = 'x';
    array1[6] = 'x';
    array1[7] = 'x';
    array1[8] = 'x';
    array1[9] = 'x';
    array1[10] = 'x';
    }
    char[] array2 = new char[11];{
    array2[0] = 'x';
    array2[1] = 'x';
    array2[2] = 'x';
    array2[3] = 'x';
    array2[4] = 'x';
    array2[5] = 'x';
    array2[6] = 'x';
    array2[7] = 'x';
    array2[8] = 'x';
    array2[9] = 'x';
    array2[10] = 'x';
}

    public void board(){


        System.out.println("           1  2  3  4  (5)  6  7  8  9  10  11");
        System.out.println("Player 1:  " + array1[0]+ "  " + array1[1] + "  " + array1[2]+ "  " + array1[3] + "   " + array1[4]+ "   " + array1[5] + "  " + array1[6]+ "  " + array1[7] + "  " + array1[8]+ "  " + array1[9] + "   " + array1[10]);
        System.out.println("Player 2:  " + array2[0]+ "  " + array2[1] + "  " + array2[2]+ "  " + array2[3] + "   " + array2[4]+ "   " + array2[5] + "  " + array2[6]+ "  " + array2[7] + "  " + array2[8]+ "  " + array2[9] + "   " + array2[10]);


    }
    public void play(){
        String p1Name = SN.GBName();
        String p2Name = SN.GBName2();
        String pArray[] = {p1Name,p2Name};


        System.out.println(p1Name + " test");

    }
}

控制台输出:

    MAIN MENU
1. Enter Player Names
2. Play Game
3. Quit
Select your number
1
Enter the first players name:
Jordan
Enter the second players name:
David
Welcome Jordan and David to AQADo! 
MAIN MENU
1. Enter Player Names
2. Play Game
3. Quit
Select your number
2
           1  2  3  4  (5)  6  7  8  9  10  11
Player 1:  x  x  x  x   x   x  x  x  x  x   x
Player 2:  x  x  x  x   x   x  x  x  x  x   x
null test

在您的main类中,创建一个setName实例,在该实例上初始化名称。 但是,在类gameBoard中,您还会创建一个setName的新实例,该实例没有初始化名称,因此将输出null

一个简单的解决方法是将main创建的SN对象作为构造函数参数传递给gameBoard

gameBoard GB = new gameBoard(SN);

这意味着gameBoard应该将以下内容定义为构造函数:

class gameBoard {
    setName SN;
    public gameBoard(setName sn) {
        this.SN = sn;
    }
    ...

gameBoard类具有其自己的setName完全不相关的实例,该实例使用null值初始化,因为您从未在该实例上调用setName1()setName2() 注意您的程序有两个单独的setName SN = new setName(); 线。

如果您想让gameBoard接收先前输入的名称,则应将它们传递给构造函数或setter方法:

public class gameBoard {
    public final String p1Name;
    public final String p2Name;

    public gameBoard(String p1Name, String p2Name) {
        this.p1Name = p1Name;
        this.p2Name = p2Name;
    }

    ...

    public void play() {
        System.out.println("In play(): " + p1Name + ", " + p2Name);
    }
}

main 输入以下名称创建带有这些名称的gameBoard

gameBoard GB = new gameBoard(p1Name, p2Name);

还有其他方法可以传递此数据,包括将setName实例传递给gameBoard ,或者让gameBoard本身负责维护单个setName实例,尽管setName不是一个很好的类。 除非您打算将更多的复杂性或抽象集成到该类中,否则它目前所做的工作太琐碎而无法证明其作为类的存在,并且将其两个输入方法吸收到main方法中会更简单,尤其是因为您已经在那里有一个Scanner实例。 换句话说,代替:

p1Name = SN.setName1();
p2Name = SN.setName2();

做:

System.out.println("Enter the first player's name:");
p1Name = user_input.nextLine();
System.out.println("Enter the second player's name:");
p2Name = user_input.nextLine();

然后删除setName类。

PS:请仔细阅读Java命名约定,因为它们会使您的代码更清晰(一旦习惯了,尤其是对于其他尝试阅读代码的人)。 类名应以大写字母开头(例如, GameBoard而不是gameBoard ); 方法和变量名不应该( getName1()而不是GBName() ); 方法名称通常应该是动词( displayBoard()而不是board() ); 而类名应为名词(如果您决定保留该类,则应为NameInputPlayerInfo而不是setName )。

当您调用SN.GBName()方法时,它将返回GlobalP1并将其分配给play()方法中的p1Name 由于未初始化GlobalP1分配任何值,因此p1Name指向Null

在您的GameBoard类中,您是一个新对象

setName SN = new setName();

但是您不会像在main方法中那样填写player1名称和player2名称。

if(mainMenuChoice == 1){
    p1Name = SN.setName1();
    p2Name = SN.setName2();
    mainMenuChoice = 0;
}

要解决此问题,请再次询问player1名称和player2名称...或将SN对象放到板上,应该没问题。

像这样:

setName SN = new setName();
gameBoard GB = new gameBoard(SN);

gameBoard类如下所示:

public class gameBoard {

    setName SN;

    public gameBoard(setName  SN) {
        this.SN = SN
    }
...
rest of the code
}

您的gameboard()类正在生成一个新的SN对象,该对象不同于您在main()中创建的SN对象。 由于您从未为新的SN对象分配名称,因此获取空引用。 名称保留在旧的main()SN中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM