在Java中执行nextInt函数时,如何修复InputMismatchException

时间:2018-07-17 05:30:42

标签: java java.util.scanner inputmismatchexception

我试图通过读取带有逗号分隔数字的txt文件来使数独验证程序正常工作。我的代码将第一行读入数组,然后在转到下一行时引发InputMismatchException错误。我尝试查找事物,但没有任何效果。这是我的代码以及txt输入文件包含的内容

String fileName = "data/sudoku-valid-1.txt";
    Scanner s = null;
    try {
        s = new Scanner(new File(fileName));
        s.useDelimiter(",");

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    int array[][] = new int[9][9];
    int i, j;
    while(s.hasNext()) {
        for(i=0; i<9; i++) {
            for(j=0; j<9; j++) {
                array[i][j] = s.nextInt();
            }
        }
    }

TXT文件:

1,5,7,9,8,3,6,2,4,

2,6,8,7,5,4,9,3,1,

9,4,3,6,1,2,7,5,8,

8,9,2,1,7,6,5,4,3,

3,1,6,5,4,8,2,7,9,

5,7,4,3,2,9,1,8,6,

7,3,5,4,6,1,8,9,2,

6,8,9,2,3,5,4,1,7,

4,2,1,8,9,7,3,6,5,

3 个答案:

答案 0 :(得分:0)

对于扫描仪,您需要检查是否存在下一个元素。在您到达行尾的情况下,您得到的是空字符串,您想将其强制转换为整数。在这种情况下,您只需跳到下一个扫描的元素。

int[][] array = new int[9][9];
try (Scanner s = new Scanner(new File(fileName))) {
  s.useDelimiter(",");

  int i, j;
  while (s.hasNext()) {
    for (i = 0; i < 9; i++) {
      for (j = 0; j < 9; j++) {
        if (s.hasNextInt())
          array[i][j] = s.nextInt();
        else if(s.hasNext())
          s.next();    
      }
    }
  }
} catch (FileNotFoundException e) {
  e.printStackTrace();
}           

其次要记得关闭扫描仪。在上面的示例中,我使用了try-catch-resources来做到这一点。

答案 1 :(得分:0)

使用分隔符也管理换行符(空格,...)。 Scanner.useDelimiter接受正则表达式

,\s*

Regex101可见

这样的优点是,您不必费心知道数据将以哪种格式显示,而无需检查任何内容即可阅读。

示例:

String s = "1,2,3,4,5,"
        + "\n6,7,8,9,10";
Scanner scan = new Scanner(s);
scan.useDelimiter(",\\s*");

while(scan.hasNext()){
    System.out.println(scan.nextInt());
}

scan.close();

输出:

1
2
3
4
5
6
7
8
9
10

答案 2 :(得分:0)

在内部for循环之后添加s.nextLine()应该可以解决您的问题。它会读取cr / lf,然后移至下一行进行读取。

import java.util.Scanner;
import java.io.FileNotFoundException;

public class MyClass {
    public static void main(String[] args)
    {
        String fileName = "1,5,7,9,8,3,6,2,4,\r\n" +
                            "2,6,8,7,5,4,9,3,1,\r\n" +
                            "9,4,3,6,1,2,7,5,8,\r\n" +
                            "8,9,2,1,7,6,5,4,3,\r\n" +
                            "3,1,6,5,4,8,2,7,9,\r\n" +
                            "5,7,4,3,2,9,1,8,6,\r\n" +
                            "7,3,5,4,6,1,8,9,2,\r\n" +
                            "6,8,9,2,3,5,4,1,7,\r\n" +
                            "4,2,1,8,9,7,3,6,5,";
        Scanner s = null;
        try {
            s = new Scanner(fileName);
            s.useDelimiter(",");

        } catch (Exception e) {
            e.printStackTrace();
        }

        int array[][] = new int[9][9];
        int i, j;
        while(s.hasNext()) {
            for(i=0; i<9; i++) {
                for(j=0; j<9; j++) {
                    array[i][j] = s.nextInt();
                }
                s.nextLine();
            }
        }

        for (i = 0; i < array.length; i++) {
            for (j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j]);
            }
            System.out.println();
        }

        s.close();
    }
}

结果:

157983624
268754931
943612758
892176543
316548279
574329186
735461892
689235417
421897365