好的,所以我似乎无法让这个工作,虽然很多人告诉我语法和逻辑是正确的。谁能告诉我我可能做错了什么?
public Scanner in = new Scanner(System.in);
public void movePlayer() {
System.out.print("move: ");
String str = in.nextLine();
in.nextLine();
char c = str.charAt(0);
if (c == 'l' || c == 'L') {
player.moveLeft();
}
}
该程序被捕获到char c = str.charAt(0);
我正在返回此错误:
java.lang.StringIndexOutOfBoundsException: 字符串索引超出范围:0(在java.lang.String中)
答案 0 :(得分:5)
您没有通过控制台输入任何内容,因此str
为空。这就是chatAt(0)
抛出异常的原因
答案 1 :(得分:3)
您不想使用nextLine()
。您想使用next()
。
String str = in.next();
的Javadoc
使此扫描程序超过当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。
您想要next()
代替:
查找并返回此扫描仪的下一个完整令牌。在完成令牌之前和之后是与分隔符模式匹配的输入。即使之前的hasNext()调用返回true,此方法也可能在等待输入扫描时阻塞。
这将阻止您消耗空行并引发异常。
答案 2 :(得分:0)
这意味着str
为空。您应该检查它是否不是null
而不是空的。
if (str != null && !str.isEmpty()) {
...
}
答案 3 :(得分:0)
多数民众赞成...因为当你试图将char
置于第0位时,它会抛出一个异常,因为大小为f的数组为0。
可能是因为获取I/O from the Command Line
而阅读此内容答案 4 :(得分:0)
添加对空字符串和空值的检查。你会避免很多麻烦。
答案 5 :(得分:0)
如果您在控制台中按Enter键,Scanner
将被视为完整的一行,无论是否输入了文字。
在行的开头按Enter键,将字符串""
返回到方法Scanner.nextLine()。
在str.lenght () > 0
之前添加str.charAt(0)
支票。
答案 6 :(得分:0)
改为使用in.next()
。出于某种原因,nextLine()
有时无法与CharAt()
一起使用。