Java:控制台跳过输入
我正在尝试使用.nextLine()中的Java:控制台跳过输入,java,console,Java,Console,我正在尝试使用.nextLine()中的解析控制台输入中的字符,并从中获取charAt(0)。我的问题是,在要求用户输入字符串以在.nextLine()中执行操作后,由于试图获取空字符串的第一个字符,它会跳过输入并产生错误 System.out.print("Select an operator (+, -, *, /), 'c' or 'C' to clear, or 'q' to quit: "); String temp = in.nextLine(); char tempOperator
解析控制台输入中的字符,并从中获取charAt(0)
。我的问题是,在要求用户输入字符串以在.nextLine()
中执行操作后,由于试图获取空字符串的第一个字符,它会跳过输入并产生错误
System.out.print("Select an operator (+, -, *, /), 'c' or 'C' to clear, or 'q' to quit: ");
String temp = in.nextLine();
char tempOperator = temp.charAt(0);
错误是
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
完整的程序可用
欢迎提出一般性意见和建议。
提前感谢。查看您的程序,这是因为String temp=in.nextLine()代码>。当用户点击“Enter”键时,它实际上跳过了这条语句,因为用户输入了“Enter”。尝试以下方法。注意,我只在.nextLine()中添加了以下行String enter=in代码>
你可以考虑的一件事不是这样做:
String temp = in.nextLine();
这样做:
String temp = in.next();
当然,这是假设您只需要用户输入的单个字符,看起来这就是您要求用户提供的全部内容。这将消除您收到的异常。但是,如果希望在用户键入多个字符时引发错误,则可能需要先读取整行以查看长度代码>,它读取下一个令牌(完整值)并将其解析为double。如果此时按下返回键,\n
是缓冲区中要读取的下一个标记
执行此操作时:String temp=in.nextLine()
,它从上一个enter的缓冲区读取\n
,并且字符(0)
失败,因为它只读取空(“”)字符串
要解决此问题,请通过在.nextLine()
中添加添加内容来跳过上一个缓冲区,将\n\r
添加为跳过模式,如下所示(这是在Scanner.class
中定义为行分隔符\u模式的模式):
或者在
循环时按如下方式放置一个小的:
String temp = "";
while((temp.length() < 0){
temp = in.nextLine();
}
String temp=”“;
while((温度长度()<0){
temp=in.nextLine();
}
问题出在.nextDouble()中的行中
将来自用户的下一个令牌读取为双精度。因此,当您将值4.5
作为输入传递时,nextDouble
只读取令牌4.5
,并在用户输入后跳过linefeed
。现在此换行(因为这是新行),将被视为下一个Scanner.nextLine
的输入。因此,您的in.nextLine
在in.nextDouble
之后,正在读取.nextDouble
中上一个in.nextDouble
留下的换行符
因此,解决方法与@tjg184在其回答中指出的相同。在.nextLine中的in.nextDouble
之后添加一个空的in.nextLine
,该空的in.nextLine
将读取剩余的换行符
cValue = in.nextDouble();
in.nextLine(); // Add this before your `while` which will read your `newline`
while (true) {
//continue;
}
然而,读取完整的输入直到换行符。因此,它不会将任何换行符
留给用户下次读取
虽然不需要这个答案,因为@tjg184的
答案也是一样的。我只是添加它来更好地解释到底发生了什么。但是你没有给出原因,为什么当用户点击Enter时会跳过这一行。这就是关键所在。用户无论如何会点击Enter对吗?@RohitJain如果你看一下针对Sc的JavaDocanner,它声明nextLine()“使此扫描仪前进超过当前行,并返回跳过的输入。”在用户刚刚输入第一个双精度值之后,按Enter键将强制执行一个新行。希望这能有所帮助。@RohitJain告诉我哪些部分不清楚。我更新了代码,以适应用户在不考虑输入的情况下按Enter键。因此in.nextDouble()只接受双精度输入,enter然后被下一个控制台使用。in但这不适用于in.nextLine,因为enter是所需输入的分隔符,对吗?我希望我有15个代表,这样我就可以向上投票给你。感谢你的解释,而不仅仅是提供解决方案。你介意解释一下为什么while循环比u更好吗在.nextLine()中另外唱一首歌?为什么需要那个while循环?@ZeroDefect:我更喜欢while循环,因为用户在输入第一个输入后可能会多次按return键。在程序没有收到真正的输入之前,这个循环保护您不受异常的影响。@tjg184。谢谢:)。你的回答也是正确的。但我加上这个答案只是为了澄清一点。
String temp = "";
while((temp.length() < 0){
temp = in.nextLine();
}
cValue = in.nextDouble();
in.nextLine(); // Add this before your `while` which will read your `newline`
while (true) {
//continue;
}