0

我的代码是这个:

    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

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

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

4

3 回答 3

2

似乎结果nextLine()是空字符串"",所以索引 0 处没有字符,所以charAt(0)throws StringIndexOutOfBoundsException

如果caracter是 Scanner 他们,我怀疑您正在使用nextLine()after 操作,这样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()再次使用并从用户那里获取下一个数据。

在这里这里看看类似的问题。

于 2013-10-22T17:25:54.853 回答
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()尝试后,在控制台上单击鼠标以查看插入符号并插入您的输入。你会看到它正在工作!

于 2013-10-22T18:38:13.157 回答
1

就像 Pshemo 指出的那样,似乎字符等于“”。当您在控制台中按 Enter 并因此向扫描仪发送一个空行时,就会发生这种情况。我不确定您要完成什么,但是像这样的小检查应该可以阻止该错误。

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

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

于 2013-10-22T17:58:21.920 回答