我正在尝试使用in.nextLine()
从控制台输入中解析一个字符,然后从charAt(0)
开始。我的问题是在要求用户输入一个字符串来执行in.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)
完整的程序可用here
欢迎提出一般意见和建议。 提前谢谢。
答案 0 :(得分:4)
执行cValue = in.nextDouble();
时,它会读取下一个标记(完整值)并将其解析为double。如果此时按下了返回键,\n
是要读取的缓冲区中的下一个标记。
执行:String temp = in.nextLine();
时,它会从上一个输入的缓冲区中读取\n
并且charAt(0)
失败,因为它只读取空(“”)字符串。
要解决此问题,请通过添加添加in.nextLine()
跳过上一个缓冲区,将\n \r
添加为跳过模式,如下所示(这是Scanner.class
中定义的模式{{1 }}):
LINE_SEPARATOR_PATTERN
或放置一个小 in.skip("\r\n|[\n\r\u2028\u2029\u0085]");
循环如下:
while
答案 1 :(得分:1)
您可能会考虑的一件事是:
String temp = in.nextLine();
这样做:
String temp = in.next();
当然,假设您只需要用户输入中的单个字符,看起来就是您要求用户提供的所有字符。这将消除您收到的异常。但是,如果您想在用户键入多个字符时抛出错误,您可能需要首先阅读整行以查看长度。
答案 2 :(得分:1)
嗯,问题出在in.nextDouble()
行。
Scanner#nextDouble
将用户的下一个标记读取为double。因此,当您传递值4.5
作为输入时,nextDouble
只会读取令牌4.5
,并在用户输入的输入后跳过linefeed
。现在这个换行(因为这是一个新行),将被视为下一个Scanner.nextLine
的输入。因此,in.nextLine
之前in.nextDouble
正在阅读之前newline
遗留的in.nextDouble
。
所以,解决方法与@ tjg184在他的回答中指出的相同。在in.nextLine
之后添加一个空的in.nextDouble
,其中会显示剩余的newline
。所以,即将到来的in.nextLine
读取实际传递的输入。
cValue = in.nextDouble();
in.nextLine(); // Add this before your `while` which will read your `newline`
while (true) {
//continue;
}
然而,Scanner.nextLine
读取完整输入直到换行符。因此,用户下次阅读时不会留下任何newline
。
虽然不需要这个答案,但@tjg184's
答案也是如此。我刚刚添加它以更好地解释究竟发生了什么。
答案 3 :(得分:0)
查看您的计划,这是因为String temp = in.nextLine();
。当用户点击“Enter”键时,它实际上是跳过此语句,因为用户键入了“Enter”键。请尝试以下方法。请注意,我只添加了以下行String enter = in.nextLine();
import java.util.Scanner;
public class Calculator
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
char operator = 'z'; //initialize operator
double cValue; //current value
double rhValue; //right hand value
boolean cont = true;
System.out.print("Enter starting value: ");
cValue = in.nextDouble();
// disregard the "Enter" key
String enter = in.nextLine();
while(true)
{
System.out.print("Select an operator (+, -, *, /), 'c' or 'C' to clear, or 'q' to quit: ");
String temp = in.nextLine();
char tempOperator = temp.charAt(0);
if (tempOperator == 'c' || tempOperator == 'C')
{
cValue = 0.0;
System.out.println("Current value is: " + cValue);
System.out.println();
}
else if(tempOperator == 'q')
{
System.out.println("Final result: " + cValue);
System.exit(1);
}
else if(tempOperator == '+' || tempOperator == '-' || tempOperator == '*' || tempOperator == '/')
{
operator = tempOperator;
break;
}
else
throw new IllegalArgumentException("operator not valid");
}
System.out.println("Enter a right hand value (type double): ");
rhValue = in.nextDouble();
System.out.println("Math expression: answer " + operator + "= " + rhValue);
switch(operator)
{
case '+': cValue =+ rhValue;
break;
case '-': cValue =- rhValue;
break;
case '*': cValue = cValue * rhValue;
break;
case '/': cValue = cValue / rhValue;
break;
}
System.out.println("Current value is: " + cValue);
}
}