这是代码
public void promptUser(){
Scanner scan = new Scanner(System.in);
System.out.print("Pick a coordinate [row col] or press [q] to quit.");
int row = 0;
int row = 0;
String line = scan.nextLine().trim();
String[] contents = line.split(" ");
if (contents[0] == "q"){
isRunning = false;
System.exit(0);
}// if quit
if (contents.length < 1 || contents.length > 2){
System.out.print("Invalid Response. Try again.");
promptUser();
}// if wrong amount of input
else {
row = Integer.parseInt(contents[0]);
col = Integer.parseInt(contents[1]);
}// parse ints else
if (inBounds(row, col) == true){
if(!(board[row][col] == 'c'){
click(row, col);
}// has been clicked
}// in bounds?
else{
System.out.print("Invalid response. Try again.");
promptUser();
}// else error
}// promptUser method
这是错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: "q"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:481)
at java.lang.Integer.parseInt(Integer.java:514)
at Minesweeper.promptUser(Minesweeper.java:197)
at Driver.main(Driver.java:12)
此方法旨在从用户处获取输入,检查其是否有错误。如果它是正确的,那么如果输入“q”则它应该退出程序并且如果它是尚未被点击的边界内的两个整数则“单击”该坐标。没有这个错误,我无法输入'q'。我输入的任何整数都会得outOfBounds exception
。 (是的,这是家庭作业,我搜索得很长很难,但还没有找到解决方法。)
任何和所有帮助都非常感激。
这是我使用的inBounds方法,以及初始化(初始化板的位置)
public void initialize(){
isRunning = true;
board = new char[this.rows][this.cols];
for (int i = 0; i < board.length; i++){
for(int j = 0; j < board[i].length; j++){
board[i][j] = 'e';
}
}
mineBoard = new boolean[this.rows][this.cols];
for (int i = 0; i < mineBoard.length; i++){
for (int j = 0; j < mineBoard[i].length; j++){
mineBoard[i][j] = false;
}
}
Random bob = new Random();
Random sally = new Random();
for (int i = mines; i > 0; i--){
int mineX = bob.nextInt(10);
int mineY = sally.nextInt(10);
if (mineBoard[mineX][mineY] == false){
mineBoard[mineX][mineY] = true;
}
else{
i++;
}
}
}
那是初始化...... 这是inBounds
private boolean inBounds(int row, int col){
if (row < 0 || row > board.length){
return false;
}
if (col < 0 || col > board[0].length){
return false;
}else
return true;
}
还有什么可以帮助吗?我用q解决了这个问题,但是我一直遇到越界问题。
答案 0 :(得分:4)
使用contents[0].equals("q")
。否则,相等性将失败,因此您的NumberFormatException
稍后会失败。您可以详细了解此common mistake。
基本上发生的事情是你有两个String
s - 文字"q"
和用户输入的split
结果。虽然两者可能语义等效(即contents[0].equals("q")
),但它们很可能不会相同,因为一个是从用户输入构造的。由于它们不是相同的对象,==
将失败,导致代码流继续运行。它将尝试调用Integer.parseInt("q")
- 由于NumberFormatException
而失败,因为它是无效的数字。
您的“ outOfBounds异常”很可能是ArrayIndexOutOfBoundsException
,这可能是由于row
,col
对您的阵列来说太大了(事实上) ,他们在它之外 - 因此,超出界限)。要验证这一点,您需要显示更多代码。
此外,您无需编写if (inBounds(row, col) == true)
。任何boolean
表达式b
都将满足重言式b <=> b == true
,即仅仅是身份。您可以编写更简洁明了的if (inBounds(row, col))
。
此外,您应该避免现在的递归。在重复无效响应的情况下,可以触发StackOverflowException
。当使用未绑定的递归时要小心,因为Java调用堆栈 有界。
答案 1 :(得分:1)
当程序员开始时,你遇到的问题很常见。基本上,==运算符会比较您要比较的两个对象的引用。对于字符串(和其他对象),这几乎总是错误的。在您的情况下,您应该使用类似的东西:
contents[0].equals("q")
这将调用String类的equals方法,它将正确地比较两个字符串的内容。