在跳过要求使用Scanner输入字符串的行之前的StringIndexOutOfBoundsException

时间:2013-10-22 17:22:23

标签: java string java.util.scanner

我的代码就是这个:

    Scanner teclado = new Scanner(System.in);
    System.out.println("Rellena con un caracter cada elemento de la primera matriz m1(" + filas1 + "," + cols1 + "), escribe sólo la letra.");
    for (int fila = 0; fila < m1.length; fila++) {
        for (int col = 0; col < m1[fila].length; col++) {
            caracter = teclado.nextLine();
            m1[fila][col] = caracter.charAt(0);
        }
    }

这里有例外 m1 [fila] [col] = caracter.charAt(0);

Java.StringIndexOutOfBoundsException

这很奇怪,因为之前的行,它没有提示扫描器要求一个字符串,只是抛出异常,所以我评论了提供异常的行,是的,它提示扫描器要求字符串。

我有点困惑为什么会这样。

3 个答案:

答案 0 :(得分:2)

似乎nextLine()的结果为空字符串"",因此索引0处没有字符,因此charAt(0)会抛出StringIndexOutOfBoundsException

如果caracter是扫描程序,我怀疑您在nextLine()等操作后使用nextInt,这将不会消耗用户数据后的新行字符。

Scanner scanner = new Scanner(System.in);
System.out.println("Write some number");
int i = scanner.nextInt();
System.out.println("Write anything");
String data = scanner.nextLine();   // this will not wait for users data
                                    // because it will read data
                                    // before new line mark that user
                                    // passed by pressing enter
System.out.println(i + ">" + data);

要解决此问题,您可以在nextLine()之后添加nextInt()以消费换行符。之后,您可以再次使用nextLine()并从用户处获取下一个数据。

查看herehere类似的问题。

答案 1 :(得分:1)

像Pshemo所指出的那样,它似乎是相同的“”。 只需在控制台中按Enter键就会发生这种情况,因此会向扫描仪发送一个空行。 我不确定你要完成什么,但像这样的小支票可以阻止这个错误。

if (!caracter.isEmpty())
    m1[fila][col] = caracter.charAt(0);

除非您还想在用户发送新行时存储。

答案 2 :(得分:1)

scanner.nextLine()的行为在JAVADOC中描述如下:

  

使此扫描程序超过当前行并返回该输入   被跳过了。此方法返回当前行的其余部分,   最后排除任何行分隔符。该职位设定为   下一行的开头。

我认为您在执行Enter后正试图按System.out.printl(whaever you were doing)。正如文档所示,尝试插入新行将被视为省略行分隔符的newLine输入,因此caracter字符串将导致空字符串""

  caracter = teclado.nextLine(); // press an ENTER
  System.out.println(caracter.equals("")); 
        // it will print true if you press ENTER while it was asking for input 
  m1[fila][col] = caracter.charAt(0); 
        // asking to get index `0` while it is empty!

立即执行System.out.println()后,尝试鼠标单击控制台以查看插入符并插入输入。你会看到它正在工作!