2016-06-08 2 views
0

Мне было интересно, может ли кто-нибудь сказать мне, почему я получаю вывод «NULL» при запуске этого и настройке имен. Я сделал метод возврата, чтобы возвращать имена из setName, но он по-прежнему отображается как null, как если бы они не были установлены.Почему эта печать NULL?

Что должно произойти - запустите главное меню - установите имена - затем запустите метод воспроизведения в gameBoard.java и увидите там имена, но я могу видеть только нуль.

Главный класс: класс

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 
+2

Ваш 'SN' из' main' - это совсем другой экземпляр, чем 'SN' из' gameBoard', поэтому 'SN' из' gameBoard' не знает имена, которые вы ввели в 'SN' из' main'. – Tom

+0

Вы должны ответить на этот вопрос и уточнить его. – Zircon

+0

@ Zircon * "и уточните на нем" *, и в этом проблема, я слишком ленив прямо сейчас: P. Может быть, вы хотите пойти и написать хороший ответ :)? – Tom

ответ

1

Когда вы вызываете метод SN.GBName(), он возвращает GlobalP1 и назначает его p1Name в методе play(). Поскольку GlobalP1 не инициализирован или ему не присвоено значение, поэтому p1Name указывает на Null.

+0

Итак, как я могу начать его инициировать? – jordan

+0

Внутри setName class change ** public String GlobalP1; ** и ** public String GlobalP2; ** to ** public static String GlobalP1; ** и ** public static String GlobalP2; ** – Leo

2

В вашем классе main вы создаете экземпляр setName, на котором вы инициализируете имена. Однако в вашем классе gameBoard вы также создаете новый экземпляр setName, который не имеет инициализированных имен, поэтому вы получаете распечатку null.

простой обходной путь будет проходить SN объект, созданный в main к gameBoard в качестве аргумента конструктора:

gameBoard GB = new gameBoard(SN); 

Это означало бы, что gameBoard должен определить что-то вроде этого, как конструктор:

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

вам не нужно использовать это. SN, потому что sn, который вы передаете в gameBoard, находится в lowecase, в то время как объект SN из класса gameBoard находится в верхнем регистре. – Igoranze

+0

В то время как технически вы правы, я считаю, что «это» иногда является хорошим напоминанием и делает более читаемым код. Это, конечно, не больно –

+0

@Igoranze, вы правы, конечно. Я все еще думаю, что это добавляет немного большей ясности, особенно если позже будет переименование. – hotzst

0

Ваш класс gameboard() генерирует новый объект SN, который отличается от объекта SN, созданного в main(). Он получает нулевые ссылки, потому что вы никогда не назначали имена этому новому объекту SN. Имена остались в старом главном() SN

1

в своем классе GameBoard вы сделать новый объект

setName SN = new setName(); 

но вы не заполнили имя 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 
} 
2

Класс gameBoard не имеет свой собственный полностью несвязанный экземпляр setName, который инициализируется с null значениями, так как вы никогда позвоните setName1(), в этом случае. Обратите внимание, что ваша программа имеет две отдельные линии setName SN = new setName();.

Если вы хотите, чтобы ваш gameBoard получить имена, набранные ранее, вы должны передать их ему в конструкторе или сеттера:

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(); 

Do:

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 класса.

P.S. Пожалуйста, ознакомьтесь с соглашениями об именах Java, поскольку они сделают ваш код более четким (как только вы привыкнете к ним, и особенно для других, пытающихся прочитать ваш код). Имена классов должны начинаться с заглавной буквы (например, GameBoard, а не gameBoard); метод и имена переменных не должны (getName1(), а не GBName()); и именами методов обычно должны быть глаголы (displayBoard(), а не board()); в то время как имена классов должны быть существительными (NameInput или PlayerInfo, а не setName, если вы решили сохранить этот класс).

Смежные вопросы