Java:控制台跳过输入

时间:2012-10-31 15:52:54

标签: java console

我正在尝试使用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

欢迎提出一般意见和建议。 提前谢谢。

4 个答案:

答案 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);
    }
}