0

Im trying to do a tactoe game, but im having some trobles. Im a begginer so i might have done someting silly but im dumb yet lol. If you could help me, I'd be thankfull. So in the main code, I should use Visual as an matrix and itwould be shown at the drawgame method, but theres a problem about nullpointerexception. I searched and found that the problem is probably related to the initialization of the matrix...

This is the error:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.company.Visual.getSymbol()" because "visual[0][0]" is null
    at com.company.Main.drawGame(Main.java:48)
    at com.company.Main.main(Main.java:21)

This is the code of the Main.java (main class):

package com.company;

import java.util.Scanner;

public class Main {
    public static void main(String[] args){


        //variables
        Visual[][] visual = new Visual[3][3];
        //public static Visual[3][3] visual = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
        char symbol='X';
        boolean game = true;
        String victory="";
        Scanner scan = new Scanner(System.in);
        //int line=0,colunm=0;


        //game
        while(game){
            if(visual!=null)drawGame(visual);

            //drawGame(visual);
            victory = verifyVictory(visual);
            if(victory.equals("")){
                System.out.printf("Player %s won!", victory);
                break;
            }
            try {
                whoPlays(visual, play(scan, symbol), symbol);
                if(symbol=='X'){
                    symbol='O';
                }else{
                    symbol='X';
                }
            } catch (Exception e) {
                System.out.println("Error!");
            }
        }
        System.out.println("End");

    }


    //function to call the Visual class and show the visual of tactoe
    public static void drawGame(Visual[][] visual){
        System.out.printf("    0    1    2\n");
        System.out.printf("0   %c | %c | %C \n", visual[0][0].getSymbol(),visual[0][1].getSymbol(),visual[0][2].getSymbol());
        System.out.printf("   --------------\n");
        System.out.printf("1   %c | %c | %C \n",visual[1][0].getSymbol(),visual[1][1].getSymbol(),visual[1][2].getSymbol());
        System.out.printf("   --------------\n");
        System.out.printf("2   %c | %c | %C \n",visual[2][0].getSymbol(),visual[2][1].getSymbol(),visual[2][2].getSymbol());

    }
    //clean the old drawGame()
    public static void clean(){
        for(int i=0;i<50;i++){
            System.out.println("");
        }
    }

    //coords to play
    public static int[] play(Scanner scan, char symbol){
        int p[] = new int[2];
        System.out.printf("%s %c\n", "Who plays: ", symbol);
        System.out.print("Line: ");
        p[0] = scan.nextInt();
        System.out.print("Colunm: ");
        p[1] = scan.nextInt();
        return p;
    }

    //who is playing
    public static boolean whoPlays(Visual[][] visual, int p[], char symbol){
        if(visual[p[0]][p[1]].getSymbol()==' '){
            visual[p[0]][p[1]].setSymbol(symbol);
            return true;
        }else{
            return false;
        }
    }

    //this is an attempt to inicialize the array visual, since I saw this might be the problem
    public static void start(Visual[][] visual){
        for(int i=0;i<3;i++){
            for(int c=0;c<3;c++){
                visual[i][c] =  new Visual();
            }
        }
    }

    //still doing this, useless by now
    public static String verifyVictory(Visual[][] visual){
        return "";
    }
}

This is the code of the Visual.java (secondary class)

package com.company;

public class Visual {
    private char symbol;

    public Visual(){
        this.symbol=' ';
    }

    public char getSymbol(){
        return this.symbol;
    }
    public void setSymbol(char symbol){
        if(this.symbol==' '){
            this.symbol=symbol;
        }else{
            System.out.println("Error");
        }
    }
}

Pedro Y
  • 16
  • When you create a reference array in the standard way, it is initially filled with null values, and you need to first fill the array slots with objects before you can use them (as per [this answer](https://stackoverflow.com/a/23852556/522444) in the duplicate). .Often this is done using a for loop. – Hovercraft Full Of Eels Jul 23 '21 at 15:39
  • Your start method appears to do this, but, correct me if I'm wrong, I don't see where you ever call this method(?). If you never call it, the array remains filled with nulls, right? – Hovercraft Full Of Eels Jul 23 '21 at 15:39
  • @HovercraftFullOfEels omg true, im so dump lmao, I forgot to call the start method -_- TY so much, hv a nice day – Pedro Y Jul 23 '21 at 15:51

0 Answers0