BufferedReader不会等到输入完成

时间:2016-06-16 11:53:28

标签: java

我的BufferedReader有一个问题,它假设一直读,直到我告诉不要这样做。但事实并非如此。为什么程序正在关闭,不等到我输入“真或假”?

public static void main(String args[]) throws IOException{
    double a;
    double b;
    char ch=' ';
    try(BufferedReader br=new BufferedReader(new InputStreamReader((System.in))))
    {
        while (true)
        {
            System.out.println("Введите a: ");
            a = Double.parseDouble(br.readLine());
            System.out.println("Введите b: ");
            b = Double.parseDouble(br.readLine());

            System.out.println("Введите символ арифметической операции, которую хотите произвести с выражением a{}b: * / + -.");
            ch = (char) br.read();
            switch (ch) {
                case '+':
                    System.out.println(a + b);
                    break;
                case '-':
                    System.out.println(a - b);
                    break;
                case '*':
                    System.out.println(a * b);
                    break;
                case '/':
                    System.out.println((b != 0) ? (a / b) : "Нельзя делить на 0!");
                    break;
                default:
                    System.out.println("Вы ввели не поддерживаемые символы!");
                    break;
            }
            System.out.println("Хотите повторить ввод? (true, false)");

            String str = br.readLine();
            System.out.println("str " + str);
            if (!Boolean.parseBoolean(str)) {
                break;
            }
        }
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

3 个答案:

答案 0 :(得分:1)

当您输入任何输入时,您还需要在当前代码中输入此行ch = (char) br.read();正在读取的换行符。

因此,要避免它,请使用以下代码接受运算符char(* / + - ):

ch = (char) br.readLine().charAt(0);   // charAt(0) returns first char from line and leaves out the newline char

或者另一种解决方案是使用br.readLine();,如下所示:

ch = (char) br.read();
br.readLine(); // here
输入运算符char后,

会消耗带换行符的行。

<强>输出:

Введите a: // Enter a
12
Введите b: // Enter b
13
// Enter symbol for arithmetic operation you want to perform with the expression of a {} b: * / + -.
Введите символ арифметической операции, которую хотите произвести с выражением a{}b: * / + -.
+
25.0
Хотите повторить ввод? (true, false) // Do you want to re-enter?
true
str true
Введите a: // Enter a

答案 1 :(得分:0)

  

更新

String str = String.valueOf(br.readLine());

然后它正在运作。

答案 2 :(得分:0)

您需要在String str = br.readLine();

之后输入另一行

让我们说

String str1 = br.readLine();
 if (!Boolean.parseBoolean(str1)) {
                    break;
                }

工作代码

public static void main(String args[]) throws IOException{


        double a;
        double b;
        char ch=' ';
        try(BufferedReader br=new BufferedReader(new InputStreamReader((System.in))))
        {while (true)

        {
            System.out.println("Введите a: ");
            a = Double.parseDouble(br.readLine());
            System.out.println("Введите b: ");
            b = Double.parseDouble(br.readLine());

            System.out.println("Введите символ арифметической операции, которую хотите произвести с выражением a{}b: * / + -.");
            ch = (char) br.read();
            switch (ch) {
                case '+':
                    System.out.println(a + b);
                    break;
                case '-':
                    System.out.println(a - b);
                    break;
                case '*':
                    System.out.println(a * b);
                    break;
                case '/':
                    System.out.println((b != 0) ? (a / b) : "Нельзя делить на 0!");
                    break;
                default:
                    System.out.println("Вы ввели не поддерживаемые символы!");
                    break;
            }
            System.out.println("Хотите повторить ввод? (true, false)");

            String str = br.readLine();
            String str1=br.readLine();// this line is added
            System.out.println("str " + str);
            if (!Boolean.parseBoolean(str1)) { //this line is modified
                break;
            }
        }


        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }