Java 当尝试使用扫描仪读取多个输入时,我可以';t让它读取整数和字符

Java 当尝试使用扫描仪读取多个输入时,我可以';t让它读取整数和字符,java,java.util.scanner,Java,Java.util.scanner,这是密码 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();

这是密码

    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
此方法用于从用户处获取输入,检查是否存在错误。如果正确,则如果输入了“q”,则应退出程序,如果坐标是边界内尚未单击的两个整数,则应“单击”坐标。如果没有此错误,我无法输入'q'。我还得到一个
边界外异常
,输入任何整数。(是的,这是我的家庭作业,我已经找了很长时间,但还没有找到解决方法。) 非常感谢您的任何帮助

这是我使用的inBounds方法和initialize(初始化电路板的地方)

public void initialize(){
isRunning=true;
board=新字符[this.rows][this.cols];
对于(int i=0;i0;i--){
int mineX=bob.nextInt(10);
int mineY=sally.nextInt(10);
if(地雷板[mineX][mineY]==false){
地雷板[mineX][mineY]=真;
}
否则{
i++;
}
}
}
这就是初始化。。。 这是内边界

    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;
        }
private boolean内边界(int行,int列){
if(行<0 | |行>线路板长度){
返回false;
}
如果(列<0 | |列>板[0]。长度){
返回false;
}否则
返回true;
}

还有什么能帮上忙的吗?我修复了q的问题,但我一直在处理越界问题。

使用
内容[0]。等于(“q”)
。否则,相等将失败,因此以后将出现
NumberFormatException
。你可以了解更多有关这方面的信息

实际上,您有两个
字符串
——文本
“q”
,以及用户输入的
拆分结果。虽然两者在语义上可能是等价的(即
内容[0].equals(“q”)
),但它们很可能并不完全相同,因为其中一个是由用户输入构建的。由于它们不是相同的对象,
==
将失败,导致代码流继续。它将尝试调用
Integer.parseInt(“q”)
——由于它是一个无效的数字,因此会出现
NumberFormatException
错误

“超出边界异常”很可能是
ArrayIndexOutOfBoundsException
,这可能是由于
col
对于数组来说太大(事实上,它们在数组之外--因此,超出边界)造成的。要验证这一点,您需要显示更多代码


此外,您不需要编写
if(inBounds(row,col)=true)
。任何
boolean
表达式
b
都将满足同义反复
b==true
,也就是说,它仅仅是一个恒等式。您只需编写更简洁、更简单的
if(inBounds(row,col))


此外,您应该避免现在的递归。在重复无效响应的情况下,可触发
StackOverflowException
。使用非绑定递归时要小心,因为Java调用堆栈是有界的。

程序员刚开始工作时,经常会遇到这个问题。基本上,==运算符比较正在比较的两个对象的引用。对于字符串(和其他对象),这几乎总是错误的。在您的情况下,您应该使用以下内容:

contents[0].equals("q")

这将调用String类的equals方法,该方法将正确比较两个字符串的内容。

请注意,错误消息会准确地告诉您哪一行引发了异常,即文件“mineswipper.java”中的第197行。这是哪一行?当用户键入“q”时,执行是否应该到达这一行代码?我怀疑不是。197是当它调用promptUser()时;重新调用该方法不合法吗?我不想重做拆分并重新分配所有内容,因为我不知道是否可以这样做…调用
promptUser()同样可以。这叫做递归。我看到其他人对此发表了评论,所以我不会透露任何细节。此外,这不是重点。我的观点是:如果用户输入'q',程序的执行是否应该达到第197行?我认为答案是否定的,因为“q”表示用户已完成,您想退出程序,对吗?如果是这样的话,那么问题一定在第197行之前的某个地方,最有可能出现在If语句中。其他人已经指出了确切的问题。我只是想说明一下我用来找出问题所在的思考过程。我相信关于教男人(或女人)钓鱼而不是给他(或她)一条鱼的格言。你能试着从用户那里获取输入吗。数组是[10][10]数组,所以0和2在里面,这就是为什么我不理解越界的原因。。。对不起,我是新手,递归是什么意思?还有,我怎样才能避免呢?@Gwyen将展示更多代码以进行演示。如果您不给我们一个更详细的异常报告(也许给我们跟踪?)以及更多代码来查看,我们就无法解决这个问题。如果你能用最少的代码创建一个展示行为的函数,那就太棒了。@Gwyen递归这里是你从
promptUser
中重复调用
promptUser
来模拟一个循环。
    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;
        }
contents[0].equals("q")