Mr_*_*ime 0 java arrays exception-handling arraylist
我是写一个井字游戏的开始.我刚刚运行它并得到以下堆栈跟踪:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:571)
at java.util.ArrayList.get(ArrayList.java:349)
at TicTacToe.isMarked(TicTacToe.java:23)
at TicTacToe.mark(TicTacToe.java:59)
at TicTacToe.main(TicTacToe.java:7)
Run Code Online (Sandbox Code Playgroud)
我怀疑这是我的ArrayList设置方式的问题?我在某处读到了导致问题的空值,但这是我第一次处理数组,所以我不熟悉这个主题.无论如何,这是我的代码:
import java.util.*;
public class TicTacToe {
public static void main(String[] args) {
newBoard();
******************System.out.println(mark(1));************
System.out.println(mark(5));
System.out.println(mark(9));
}
// Creates a blank board.
public static ArrayList<String> newBoard() {
ArrayList<String> board = new ArrayList<String>(8);
return board;
}
// Returns true if the square has been marked.
public static boolean isMarked(int numberOfSquare) {
if (numberOfSquare > 9 || numberOfSquare < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
************if (newBoard().get(numberOfSquare - 1) == null) {***********
return false;
} else
return true;
}
// Returns the number of moves that have been made.
public static int moveCount() {
return countMove();
}
// If called, adds 1 to number of moves.
public static int countMove() {
int moveNumber = 0;
moveNumber++;
return moveNumber;
}
// Checks for a win at the specified array location and player (X or O).
public static boolean checkForWin(int x, int y, int z, int player) {
if (player == 0) {
return (newBoard().get(x)).equals("O")
&& (newBoard().get(y)).equals("O")
&& (newBoard().get(y)).equals("O");
} else {
return (newBoard().get(x)).equals("O")
&& (newBoard().get(y)).equals("O")
&& (newBoard().get(y)).equals("O");
}
}
// Places an X or O on the specified square.
public static boolean mark(int markSquareNumber) {
if (markSquareNumber > 9 || markSquareNumber < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
***********if (isMarked(markSquareNumber)) {*******************
throw new IllegalArgumentException("Square is already marked.");
}
if (moveCount() % 2 != 0) {
newBoard().add(markSquareNumber - 1, "X");
countMove();
} else {
newBoard().add(markSquareNumber - 1, "O");
countMove();
}
if (checkForWin(0, 1, 2, 1) || checkForWin(3, 4, 5, 1)
|| checkForWin(6, 7, 8, 1)) {
System.out.println("Player-X just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 1) || checkForWin(1, 4, 7, 1)
|| checkForWin(2, 5, 8, 1)) {
System.out.println("Player-X just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 1) || checkForWin(2, 4, 6, 1)
|| checkForWin(0, 4, 8, 1)) {
System.out.println("Player-X just won diagonally!");
return true;
}
if (checkForWin(0, 1, 2, 0) || checkForWin(3, 4, 5, 0)
|| checkForWin(6, 7, 8, 0)) {
System.out.println("Player-O just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 0) || checkForWin(1, 4, 7, 0)
|| checkForWin(2, 5, 8, 0)) {
System.out.println("Player-O just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 0) || checkForWin(2, 4, 6, 0)
|| checkForWin(0, 4, 8, 0)) {
System.out.println("Player-O just won diagonally!");
return true;
} else
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我只是通过堆栈跟踪中出现的行放了一大堆星号.如果有人能够指出我出错的地方那将是出色的,谢谢!
好的,这是我提出的所有精彩输入之后的解决方案:(请仅将其用于教育和参考目的,如果您在我的CS1410课程中并且您复制,我不想被我的教授大吼大叫我!!!!)
//Written by JTN for Assignment7.3- CS1410; October 2010.
import java.util.*;
public class TicTacToe {
private static int moveNumber = 0;
private static ArrayList<String> board = new ArrayList<String>(8);
public static void main(String[] args) {
newBoard();
mark(1);mark(2);
mark(5);mark(3);
mark(9);
boardString();
}
// Returns the number of moves that have been made.
public static int moveCount() {
return (countMove()-1);
}
// If called, adds 1 to number of moves.
public static int countMove() {
moveNumber= moveNumber + 1;
return moveNumber;
}
// Creates a blank board.
public static ArrayList<String> newBoard() {
for (int i = 0; i <= 8; i++)
board.add("_");
return board;
}
// Returns true if the square has been marked.
public static boolean isMarked(int numberOfSquare) {
if (numberOfSquare > 9 || numberOfSquare < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
if ((board.get(numberOfSquare - 1)).equals("_")) {
return false;
} else
return true;
}
// Checks for a win at the specified array location and player (X or O).
public static boolean checkForWin(int x, int y, int z, int player) {
if (player == 0) {
return (board.get(x)).equals("O")
&& (board.get(y)).equals("O")
&& (board.get(z)).equals("O");
}
else {
return (board.get(x)).equals("X")
&& (board.get(y)).equals("X")
&& (board.get(z)).equals("X");
}
}
// Places an X or O on the specified square.
public static boolean mark(int markSquareNumber) {
if (markSquareNumber > 9 || markSquareNumber < 1) {
throw new IllegalArgumentException("Input a valid square number.");
}
if (isMarked(markSquareNumber)) {
throw new IllegalArgumentException("Square is already marked.");
}
if ((countMove() % 2) == 0){
board.set(markSquareNumber - 1, "O");
}
else {
board.set(markSquareNumber - 1, "X");
}
if (checkForWin(0, 1, 2, 1) || checkForWin(3, 4, 5, 1)
|| checkForWin(6, 7, 8, 1)) {
System.out.println("Player-X just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 1) || checkForWin(1, 4, 7, 1)
|| checkForWin(2, 5, 8, 1)) {
System.out.println("Player-X just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 1) || checkForWin(2, 4, 6, 1)
|| checkForWin(0, 4, 8, 1)) {
System.out.println("Player-X just won diagonally!");
return true;
}
else if (checkForWin(0, 1, 2, 0) || checkForWin(3, 4, 5, 0)
|| checkForWin(6, 7, 8, 0)) {
System.out.println("Player-O just won horizontally!");
return true;
} else if (checkForWin(0, 3, 6, 0) || checkForWin(1, 4, 7, 0)
|| checkForWin(2, 5, 8, 0)) {
System.out.println("Player-O just won vertically!");
return true;
} else if (checkForWin(0, 4, 5, 0) || checkForWin(2, 4, 6, 0)
|| checkForWin(0, 4, 8, 0)) {
System.out.println("Player-O just won diagonally!");
return true;
} else
return false;
}
public static String boardString(){
String row1 = board.get(0)+"|"+board.get(1)+"|"+board.get(2);
String row2 = board.get(3)+"|"+board.get(4)+"|"+board.get(5);
String row3 = board.get(6)+"|"+board.get(7)+"|"+board.get(8);
System.out.println(row1);
System.out.println(row2);
System.out.println(row3);
return row1+row2+row3;
}
}
Run Code Online (Sandbox Code Playgroud)
这条线
ArrayList<String> board = new ArrayList<String>(8);
Run Code Online (Sandbox Code Playgroud)
将不创建8个字符串数组(或9个字符串对于这个问题,如果是这样的意图).它将创建一个ArrayList,初始容量为8个元素,但大小为0.
在为电路板创建ArrayList之后,您必须使用add-method 使用元素填充它.尝试做类似的事情:
public static ArrayList<String> newBoard() {
ArrayList<String> board = new ArrayList<String>(8);
for (int i = 0; i < 9; i++)
board.add("");
return board;
}
Run Code Online (Sandbox Code Playgroud)
消息Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0说您正在尝试访问长度为0的列表中的第0个元素(在没有元素的列表中).
此外,以下行:
newBoard().add(markSquareNumber - 1, "X");
Run Code Online (Sandbox Code Playgroud)
应该是
newBoard().set(markSquareNumber - 1, "X");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |