Java 跳过要求使用扫描仪输入字符串的行之前的StringIndexOutOfBoundsException

Java 跳过要求使用扫描仪输入字符串的行之前的StringIndexOutOfBoundsException,java,string,java.util.scanner,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++) {

我的代码是:

    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);
        }
    }
这很奇怪,因为之前的那行,它不会提示扫描器请求字符串,只是抛出异常,所以我对给出异常的那行进行了注释,是的,它会提示扫描器请求字符串


我有点困惑它为什么会发生。

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

如果
caracter
被扫描,我怀疑您在像
nextInt
这样的操作之后使用了
nextLine()
,它不会在用户数据之后使用新行字符

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()
之后添加
nextLine()
以使用新行字符。之后,您可以再次使用
nextLine()
,并从用户处获取下一个数据


看一看,并寻找类似的问题

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

如果
caracter
被扫描,我怀疑您在像
nextInt
这样的操作之后使用了
nextLine()
,它不会在用户数据之后使用新行字符

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()
之后添加
nextLine()
以使用新行字符。之后,您可以再次使用
nextLine()
,并从用户处获取下一个数据


看一看,并寻找类似的问题

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

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

除非您还希望在用户发送新行时进行存储。

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

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

除非您还希望在用户发送新行时进行存储。

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

使扫描器前进超过当前行并返回 被跳过了。此方法返回当前行的其余部分, 不包括结尾处的任何行分隔符。该位置设置为 下一行的开头

我想您正在尝试在执行
System.out.printl(无论您在做什么)
之后立即按
Enter
。正如文档建议的那样,尝试插入新行将被视为新行输入,忽略行分隔符,因此
caracter
字符串将导致空字符串
“”


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

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

使扫描器前进超过当前行并返回 被跳过了。此方法返回当前行的其余部分, 不包括结尾处的任何行分隔符。该位置设置为 下一行的开头

我想您正在尝试在执行
System.out.printl(无论您在做什么)
之后立即按
Enter
。正如文档建议的那样,尝试插入新行将被视为新行输入,忽略行分隔符,因此
caracter
字符串将导致空字符串
“”


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

是的,但是程序跳过了要求输入字符串的部分,我知道,我是在问为什么它会跳过
nextLine()
,或者为什么它会返回空字符串…@rokimoki很难说为什么它会发生在你发布的代码中。我们甚至不知道什么是teclado(BufferedReader,Scanner,其他东西)。您应该发布我们可以用来重现您的问题的代码,并提供我们应该与此代码一起使用的输入数据。然后我们可以从问题开始看。它只有几行,很抱歉
teclado
,它是
Scanner-teclado=new Scanner(System.in)
@rokimoki检查我编辑的答案。我不确定这是否是问题所在,但这似乎是可能的。@Pshemo,对不起,我搞错你了。但是你想要的关于
nextLine()。我们甚至不知道什么是teclado(BufferedReader,Scanner,其他东西)。您应该发布我们可以用来重现您的问题的代码,并提供我们应该与此代码一起使用的输入数据。然后我们可以从问题开始看。它只有几行,很抱歉
teclado
,它是
Scanner-teclado=new Scanner(System.in)
@rokimoki检查我编辑的答案。我不确定这是否是问题所在,但这似乎是可能的。@Pshemo,对不起,我搞错你了。但是我想,你想要的关于
nextInt()
的答案并不是@rokimoki的答案。有没有办法清理缓冲区?我的意思是有一个“干净”的下一行()请你换一句话好吗。你说的干净
ne是什么意思