当尝试使用扫描仪读取多个输入时,我无法读取整数和字符

时间:2012-09-10 00:12:13

标签: 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();
        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解决了这个问题,但是我一直遇到越界问题。

2 个答案:

答案 0 :(得分:4)

使用contents[0].equals("q")。否则,相等性将失败,因此您的NumberFormatException稍后会失败。您可以详细了解此common mistake

基本上发生的事情是你有两个String s - 文字"q"和用户输入的split结果。虽然两者可能语义等效(即contents[0].equals("q")),但它们很可能不会相同,因为一个是从用户输入构造的。由于它们不是相同的对象,==将失败,导致代码流继续运行。它将尝试调用Integer.parseInt("q") - 由于NumberFormatException而失败,因为它是无效的数字。

您的“ outOfBounds异常”很可能是ArrayIndexOutOfBoundsException,这可能是由于rowcol对您的阵列来说太大了(事实上) ,他们在它之外 - 因此,超出界限)。要验证这一点,您需要显示更多代码。


此外,您无需编写if (inBounds(row, col) == true)。任何boolean表达式b都将满足重言式b <=> b == true,即仅仅是身份。您可以编写更简洁明了的if (inBounds(row, col))

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

答案 1 :(得分:1)

当程序员开始时,你遇到的问题很常见。基本上,==运算符会比较您要比较的两个对象的引用。对于字符串(和其他对象),这几乎总是错误的。在您的情况下,您应该使用类似的东西:

contents[0].equals("q")

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