2016-06-16 27 views
-2

我的BufferedReader有一个问题,它假设一直读取,直到我告诉不要这样做。但事实并非如此。为什么在程序中关闭,不等到我输入“true或false”?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(); 
    } 
} 
+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 

在输入运算符字符后,会消耗换行符符合的行。

输出:

Введите 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 
0

UPDATE

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

那么它的工作。

+1

我不同意。原来的顺序对我来说似乎是正确的。 –

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(); 
     } 
    } 
+0

@downvoter请加个评论 – SpringLearner

+0

@Orions我不明白她在控制台上打印的目的。如果她想知道输入,那么她可以执行'System.out.println(“str1”+ str1);' – SpringLearner

+0

@Orions我在发布之前运行代码。如果你在结束时输入true,那么循环将继续。 – SpringLearner