java - 为什么我的 Connect 4 程序中出现 NullPointerException?

标签 java eclipse oop

有人可以解释一下为什么当我尝试在 Connect Four 板上放置计数器时会收到 NullPointerException 错误吗:

Exception in thread "main" java.lang.NullPointerException
at Counter.canMakeMove(Counter.java:26)
at Main.main(Main.java:31)

我知道当程序尝试引用具有空值的对象时会发生 NullPointerException 错误,但我无法理解它从哪里派生该空值?

我正在尝试编写面向对象的代码,因此也将不胜感激任何 future 的评论/提示!

Main.java

import java.io.InputStreamReader;
import java.util.Random;
import java.io.BufferedReader;
import java.io.IOException;

public class Main {

public static void main(String args[])throws IOException{

    Board Connect4 = new Board();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Welcome to Connect 4");
    System.out.println("There are 2 players red and yellow");
    System.out.println("Player 1 is Red, Player 2 is Yellow");
    System.out.println("To play the game type in the number of the boardColumn you want to drop you counter in");
    System.out.println("A player wins by connecting 4 counters in a row - vertically, horizontally or diagonally");
    System.out.println("");
    Connect4.printBoard();
    outer:

        while(true){

            int boardColumn = 0;

            //Player One Logic ----------------------------------------------------------------
            while(true){
                System.out.println("");
                System.out.println("Player 1, please select your column:");
                boardColumn = Integer.parseInt(br.readLine());
                if(Connect4.canMakeMove(boardColumn)){
                    if(Connect4.placeCounter(boardColumn, 1)){
                        Connect4.printBoard();
                        System.out.println("");
                        System.out.println("Congratulations! Player 1 has won the game");
                        break outer;
                    }
                    break;
                }
                else
                    System.out.println("Column "+boardColumn+" is already full!!");
            }
            Connect4.printBoard();

            //Player Two Logic ---------------------------------------------------------------   
            while(true){
                System.out.println("");
                System.out.println("The Computer has selected a column and played a counter");
                System.out.println("");

                Random r = new Random();
                int num = r.nextInt(7);

                boardColumn = num;

                if(Connect4.canMakeMove(boardColumn)){
                    if(Connect4.placeCounter(boardColumn, 2)){
                        Connect4.printBoard();
                        System.out.println("");
                        System.out.println("Unlucky! The Computer has won this game");
                        break outer;
                    }
                    break;
                }
                else
                    System.out.println("Column "+boardColumn+" is already full!!");
            }
            Connect4.printBoard();

            if(Connect4.gameDrawn()){
                System.out.print("The game has ended in a draw. Please start the game again.");
                break;
            }
        }
}

Board.java

public class Board extends Counter {

static int totalPlayed;
static int[][] gameBoard;
static int widthOfBoard=7;
static int heightOfBoard=7;

public static int [][] getBoard() {
    return gameBoard;
}

public static int getWidth() {
    return widthOfBoard;
}

public static int getHeight() {
    return heightOfBoard;
}

public static int getTotal() {
    return totalPlayed;
}

public Board(){
    gameBoard = new int[heightOfBoard][widthOfBoard];
    totalPlayed=0;
}

public void printBoard(){
    for(int i=0;i<gameBoard.length;i++){
        for(int j=0;j<gameBoard[0].length;j++){
            if(gameBoard[i][j] == 0)
                System.out.print(".  ");
            else
                System.out.print(gameBoard[i][j]+"  ");
        }
        System.out.println("");
    }
    System.out.println("--------------------");
    System.out.println("0  1  2  3  4  5  6");
}


}

Counter.Java

public abstract class Counter {


int widthOfBoard = Board.getWidth();
int [][] gameBoard = Board.getBoard();
int heightOfBoard = Board.getHeight();
int totalPlayed = Board.getTotal();

public boolean placeCounter(int boardColumn, int playerNum){
    int i=0;
    for(i=0;i<widthOfBoard;i++){
        if(gameBoard[i][boardColumn] == 1 || gameBoard[i][boardColumn] == 2){
            gameBoard[i-1][boardColumn]=playerNum;
            break;
        }
    }
    if(i == widthOfBoard)
        gameBoard[i-1][boardColumn]=playerNum;

    totalPlayed++;
    return isConnected(i-1,boardColumn);
}

public boolean canMakeMove(int boardColumn){
    return gameBoard[0][boardColumn] == 0; 
}

public boolean gameDrawn(){
    return totalPlayed == widthOfBoard * heightOfBoard;
}

public boolean isHorizontal(int x, int y) {
    int count = 0;
    int i=y;
    int num=gameBoard[x][y];

    //HORIZONTAL.
    while(i<widthOfBoard && gameBoard[x][i] == num){
        count++;
        i++;
    }
    i=y-1;
    while(i>=0 && gameBoard[x][i] == num){
        count++;
        i--;
    }
    if(count == 4)
        return true;
    return false;
}

public boolean isVertical(int x, int y) {
    //VERTICAL.
    int count=0;
    int j=x;
    int num=gameBoard[x][y];

    while(j<widthOfBoard && gameBoard[j][y] == num){
        count++;
        j++;
    }
    if(count == 4)
        return true;
    return false;
}

public boolean isRightDiagonal(int x, int y) {
    //SECONDARY DIAGONAL.
    int count=0;
    int i=x;
    int j=y;
    int num=gameBoard[x][y];

    while(i<widthOfBoard && j<widthOfBoard && gameBoard[i][j] == num){
        count++;
        i++;
        j++;
    }

    if(count == 4)
        return true;
    return false;
}

public boolean isLeftDiagonal(int x, int y) {
    //LEADING DIAGONAL.
    int count=0;
    int i = x;
    int j=y;
    int num=gameBoard[x][y];

    while(i<widthOfBoard && j>=0 && gameBoard[i][j] == num){
        count++;
        i++;
        j--;
    }

    if(count == 4)
        return true;
    return false;
}

public boolean isConnected(int x, int y){

    isHorizontal(x, y);

    isVertical(x, y);

    isRightDiagonal(x, y);

    isLeftDiagonal(x, y);

    return false;

}
}

最佳答案

将数组和播放计数器初始化移动到static block 中。这确保 the board is initialized在调用任何方法之前:

static {
    gameBoard = new int[heightOfBoard][widthOfBoard];
    totalPlayed=0;
}

关于java - 为什么我的 Connect 4 程序中出现 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55996151/

相关文章:

java - OkHttp 不缓存请求

java gson - 检查 JsonElement 是字符串还是 JsonObject

java - 在应用程序中显示来自 EditTextPreference 的文本?

java - 安装 SVN 后 Eclipse 在加载工作台时卡住

java - Eclipse 如何查看 Java 文件而不是类文件

java - Selenium RC 无法检索或页面加载超时。

java - 如何在 Java 中引用外部库?

class - 为什么可以修改 Raku 类的只读数组属性?

javascript - 如何不重复自己并改进我的应用程序布局对象?

java - 如何将椭圆形移动到鼠标单击的坐标?