gpt4 book ai didi

java关闭扫描仪和越界异常

转载 作者:行者123 更新时间:2023-12-01 08:48:54 25 4
gpt4 key购买 nike

我的代码中出现了两种不同类型的错误。

其中一个是当有人输入大于 8 或小于 0 的数字时。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 22
at boter_kaas_en_eiren.Board.placeAttempt(Board.java:37)
at boter_kaas_en_eiren.Game.play(Game.java:28)
at boter_kaas_en_eiren.MainClass.main(MainClass.java:12)

另一个错误是当玩家获胜并且我想关闭扫描仪以便没有人可以再玩时。

Exception in thread "main" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Unknown Source)
at java.util.Scanner.findWithinHorizon(Unknown Source)
at java.util.Scanner.nextLine(Unknown Source)
at boter_kaas_en_eiren.Game.play(Game.java:23)
at boter_kaas_en_eiren.MainClass.main(MainClass.java:12)

如果有人可以帮助我,我会很感激。

游戏类

package boter_kaas_en_eiren;

import java.util.Scanner;

public class Game {

private Board board;
private boolean gameFinished;

public Game() {
board = new Board();
gameFinished = false;
}

public void play() {
Scanner scan = new Scanner(System.in);
int x = 0;
String nextSymbol = "x";

board.ShowBoard();

while (gameFinished == false) {
String input = scan.nextLine();
int position = Integer.parseInt(input);

boolean highorlow = board.tohighorlow(position);

boolean succes = board.placeAttempt(position, nextSymbol);

if (highorlow) {
if (succes) {
if (nextSymbol.equals("x")) {
nextSymbol = "o";

} else {
nextSymbol = "x";
}

}
}

board.ShowBoard();

if (board.checkWinner("x") == true) {
System.out.println("x wins");
scan.close();
}
if (board.checkWinner("o") == true) {
System.out.println("x wins");
scan.close();
}

}

}

}

主类

package boter_kaas_en_eiren;

public class MainClass {

public static void main(String[] args) {


Game game = new Game();



game.play();
}

}

板级

package boter_kaas_en_eiren;

import java.util.Scanner;

public class Board {

private String[] board;

public Board() {
board = new String[9];

for (int i = 0; i < board.length; i++) {
board[i] = " ";
}

}

public void ShowBoard() {

System.out.println(board[0] + "|" + board[1] + "|" + board[2]);
System.out.println(board[3] + "|" + board[4] + "|" + board[5]);
System.out.println(board[6] + "|" + board[7] + "|" + board[8]);
System.out.println("");

}

public boolean tohighorlow(int position) {
if (position <= 8 && position >= 0) {
return true;
} else {
System.out.println("Invalid!!");
return false;
}
}

public boolean placeAttempt(int position, String symbol) {
if (board[position].equals(" ")) {
board[position] = symbol;
return true;
} else {
System.out.println("invalid!");
return false;
}

}

public boolean checkWinner(String symbol) {
if (board[0].equals(symbol) && board[1].equals(symbol) && board[2].equals(symbol)) {
return true;
} else if (board[3].equals(symbol) && board[4].equals(symbol) && board[5].equals(symbol)) {
return true;
} else if (board[6].equals(symbol) && board[7].equals(symbol) && board[8].equals(symbol)) {
return true;
} else if (board[0].equals(symbol) && board[3].equals(symbol) && board[6].equals(symbol)) {
return true;
} else if (board[1].equals(symbol) && board[4].equals(symbol) && board[7].equals(symbol)) {
return true;
} else if (board[2].equals(symbol) && board[5].equals(symbol) && board[8].equals(symbol)) {
return true;
} else if (board[0].equals(symbol) && board[4].equals(symbol) && board[8].equals(symbol)) {
return true;
} else if (board[2].equals(symbol) && board[4].equals(symbol) && board[6].equals(symbol)) {
return true;
} else {
return false;
}
}

}

最佳答案

如果您彻底检查异常中给出的源代码行,您可能可以自己找到问题。但这一次我们一起来看看:

ArrayIndexOutOfBoundsException

这意味着您正在尝试访问根本不存在的数组元素。在您的 Game 类中,您有以下两行:

boolean highorlow = board.tohighorlow(position);
boolean succes = board.placeAttempt(position, nextSymbol);

查看tohighorlow(),我们发现这一行:

if (position <= 8 && position >= 0) {
return true;
}

但是,如果数字在 [0..8] 范围内,则返回 true。换句话说,当您的数字既不太高也不太低时,该方法返回true。最简单的解决方法是更改​​条件,如下所示:

if (position > 8 || position < 0) 

现在大于 8 或小于 0 的数字将产生 true,这似乎是该方法应该做的事情。或者,您可以交换 ifelse 的主体。

无论如何,当您在 Game 类中调用 placeAttempt() 时,您都会忽略此方法的结果。这不好,因为查看 placeAttempt() 我们发现这一行:

 if (board[position].equals(" ")) { /* ... */

这就是异常的来源。您正在访问 board 数组而不检查 position 值。或者更确切地说,您确实检查了 position 值,但没有遵守此处检查的结果。因此,例如,如果 position-212,您将遇到麻烦,因为这些元素不存在(超出范围) )。

IllegalStateException:扫描仪已关闭

让我们暂时简化一下 Game 类的 play() 方法:

public void play() {
Scanner scan = new Scanner(System.in);
/* ... */

while (gameFinished == false) {
String input = scan.nextLine();
/* ... */

boolean highorlow = board.tohighorlow(position);
boolean succes = board.placeAttempt(position, nextSymbol);
/* ... */

if (board.checkWinner("x") == true) {
System.out.println("x wins");
scan.close();
}
if (board.checkWinner("o") == true) {
System.out.println("x wins");
scan.close();
}
}
}

您要做的第一件事是创建扫描仪。现在,在某些情况下(末尾的两个 if),您可以关闭扫描仪。但是,您可以在循环内执行此操作。关闭扫描仪后,循环从第一行开始:

String input = scan.nextLine();

但是您无法获取关闭的扫描仪的下一行。

附加说明

我注意到你的风格很不一致。例如,请参阅以下三个方法名称:ShowBoardplaceAttempttohighorlow。您对每个使用不同的大小写。我强烈建议坚持recommended naming convention ,这意味着首字母小写的驼峰式命名法:showBoardplaceAttempttooHighOrLow(另请注意 to也是)。

希望这有帮助。

关于java关闭扫描仪和越界异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42508832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com