Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:控制台跳过输入_Java_Console - Fatal编程技术网

Java:控制台跳过输入

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

我正在尝试使用.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 = 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;
}