Question

enter image description hereI have written some methods, and I keep getting a NoSuchElementException error when I try to run main, which allows me to play a Tic Tac Toe game. This occurs when I try to get a row and column value from the user, with enterMove(), as shown below:

import java.util.Scanner;

public class TicTacToeMethods {

// Create a new board for players to use
public static String[][] createBoard(){

    String[][] board = new String[3][3];
    for(int r = 0; r < 3; r++){
        for(int c = 0; c < 3; c++){
            board[r][c] = " _ ";
        }
    }
    return board;

}

// Display the board each time a move is made
public static String displayBoard(String[][] board){

    String graphicalBoard = "";
    for(int r = 0; r < 3; r++){
        for(int c = 0; c < 3; c++){
            graphicalBoard += board[r][c];
        }
        graphicalBoard += "\n";
    }
    return graphicalBoard;

}

// Check to see if the game has been won
public static String gameWon(String[][] board){

    /*
    Board setup reference
    A B C
    D E F
    G E H

    A = (0,0) B = (0,1) C = (0,2)
    D = (1,0) E = (1,1) F = (1,2)
    G = (2,0) H = (2,1) I = (2,2)
    */
    String winner = "";
    boolean xWon = false;
    boolean oWon = false;

    // Check if X won
    boolean firstRowX = (board[0][0].equals(" X ") && board[0][1].equals(" X ") && board[0][2].equals(" X "));

    boolean secondRowX = (board[1][0].equals(" X ") && board[1][1].equals(" X ") && board[1][2].equals(" X "));

    boolean thirdRowX = (board[2][0].equals(" X ") && board[2][1].equals(" X ") && board[2][2].equals(" X "));

    boolean diagonalOneX = (board[0][0].equals(" X ") && board[1][1].equals(" X ") && board[2][2].equals(" X "));

    boolean diagonalTwoX = (board[0][2].equals(" X ") && board[1][1].equals(" X ") && board[2][0].equals(" X "));

    boolean[] resultsForX = {firstRowX,secondRowX,thirdRowX,diagonalOneX,diagonalTwoX};

    // Check if O won
    boolean firstRowO = (board[0][0].equals(" O ") && board[0][1].equals(" O ") && board[0][2].equals(" O "));

    boolean secondRowO = (board[1][0].equals(" O ") && board[1][1].equals(" O ") && board[1][2].equals(" O "));

    boolean thirdRowO = (board[2][0].equals(" O ") && board[2][1].equals(" O ") && board[2][2].equals(" O "));

    boolean diagonalOneO = (board[0][0].equals(" O ") && board[1][1].equals(" O ") && board[2][2].equals(" O "));

    boolean diagonalTwoO = (board[0][2].equals(" O ") && board[1][1].equals(" O ") && board[2][0].equals(" O "));

    boolean[] resultsForO = {firstRowO,secondRowO,thirdRowO,diagonalOneO,diagonalTwoO};

    for(boolean each : resultsForX){
        if(each == true){
            xWon = true;
            break;
        }
    }

    for(boolean each : resultsForO){
        if(each == true){
            oWon = true;
            break;
        }
    }

    // Return a winner, or a blank if no one has won
    if(xWon){
        winner = "X";
    }
    if(oWon){
        winner = "O";
    }
    return winner;

}

// Validate a player's move
public static boolean validMove(int row, int column, String[][] board){
    return ((board[row][column] != " X ") && (board[row][column] != " O "));
}

// Enter a move for the turn player
public static void enterMove(String turnPlayer,String[][] board){

    Scanner keyboard = new Scanner(System.in);
    //int row, column;
    boolean valid;

    System.out.print("Enter a row value for your move (1 - 3): ");
    **int row = keyboard.nextInt();**

    System.out.print("Enter a column value for your move (1 - 3): ");
    int column = keyboard.nextInt();

    valid = validMove(row - 1,column - 1,board);

    while(!valid){
        System.out.print("Enter a row value for your move (1 - 3): ");
        row = keyboard.nextInt();

        System.out.print("Enter a column value for your move (1 - 3): ");
        column = keyboard.nextInt();

        valid = validMove(row - 1,column - 1,board);
    }

    switch(turnPlayer){
        case "X":
            board[row - 1][column - 1] = " X ";
            break;
        case "O":
            board[row - 1][column - 1] = " O ";
            break;
        default:
            break;
    }

    keyboard.close();

}

}

Is there something wrong with me allowing the user to choose from 1 - 3, instead of 0 - 2 for the array? Or should I change something else? Thank you in advance!

Note - The problematic line has been surrounded with asterisks, in enterMove()

EDIT: Stacktrace as requested

Was it helpful?

Solution

You are closing the Scanner element, so you are closing the underlying InputStream, System.in

So, no other Scanner can read again and a java.util.NoSuchElementException Will be thrown.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top