Java 循环中的BufferedReader错误

Java 循环中的BufferedReader错误,java,input,console,buffered,Java,Input,Console,Buffered,这个循环第一次迭代时效果很好,但在我按下字符“y”以重复之后,下次显示时,它将不允许我输入其他名称。我不知道是什么原因导致了这种情况,但当需要清除输入缓冲区时,它让我想起了C 任何帮助都将不胜感激 byte counter = 1; boolean myCondition = false; List<String> myList = new ArrayList(); BufferedReader objReader = new BufferedReader(new InputStre

这个循环第一次迭代时效果很好,但在我按下字符“y”以重复之后,下次显示时,它将不允许我输入其他名称。我不知道是什么原因导致了这种情况,但当需要清除输入缓冲区时,它让我想起了C

任何帮助都将不胜感激

byte counter = 1;
boolean myCondition = false;
List<String> myList = new ArrayList();
BufferedReader objReader = new BufferedReader(new InputStreamReader(System.in));

do{
    System.out.println("Enter the #" +counter +" person's name:");
    // low quality validation
    String dude = objReader.readLine();

    while (myList.contains(dude)){
        System.out.println("Man, this dude:" +dude +" is already loaded into the List! Pick another name:\n");
        dude = objReader.readLine();            
    }

    myList.add(dude);
    counter++;
    System.out.println("Would you like to add another name to the list? yes/no");

    char myChar = (char) System.in.read();

    if (myChar == 'y' || myChar == 'Y')
        myCondition = true;
    else
        myCondition = false;

    } while (myCondition);
字节计数器=1;
布尔myCondition=false;
List myList=new ArrayList();
BufferedReader objReader=新的BufferedReader(新的InputStreamReader(System.in));
做{
System.out.println(“输入#“+计数器+”人名:”;
//低质量验证
String dude=objReader.readLine();
while(myList.contains(dude)){
System.out.println(“伙计,这个家伙:+dude+”已经加载到列表中了!请选择另一个名称:\n”);
dude=objReader.readLine();
}
我的列表。添加(都德);
计数器++;
System.out.println(“是否要在列表中添加其他名称?是/否”);
char myChar=(char)System.in.read();
如果(myChar=='y'| | myChar=='y')
myCondition=true;
其他的
真菌病=假;
}while(myCondition);

尝试移动
BufferedReader objReader=新的BufferedReader(新的InputStreamReader(System.in))在do/while循环中。这样,每次都应该重新初始化它。

查看您的代码:

  • 你读的是“y”字
  • char myChar=(char)System.in.read()等待,直到按下
    Enter
  • myChar现在是“y”。这将在缓冲区中保留“\n”('Enter')
  • 下一步
    String dude=objReader.readLine()读取缓冲区中已存在的以“\n”结尾的行
  • 你应该读整行而不是简单的
    read()

    如果希望y的分辨率更好,请执行以下操作:

    String line = objReader.readLine();
    myCondition = line.startsWith("Y") || line.startsWith("y");
    
    试试这个

    System.out.println("Would you like to add another name to the list? yes/no");
    Scanner scan = new Scanner(System.in);
    String myChar = scan.nextLine();
    
    if (myChar.equals("y") || myChar.equals("Y"))
        myCondition = true;
    else
        myCondition = false;
    

    使用扫描器和其他一些小的代码更改可以很好地工作

     byte counter = 1;
                boolean myCondition = false;
                Scanner scan = new Scanner(System.in);
                List<String> myList = new ArrayList();
    
                do{
                      System.out.println("Enter the #" + counter + " person's name:");
                      // low quality validation
                      String dude = scan.nextLine();
                      while (myList.contains(dude)) {
                        System.out.println("Man, this dude:" + dude + " is already loaded into the List! Pick another name:\n");
                      }
                      myList.add(dude);
                      counter++;
                      System.out.println("Would you like to add another name to the list? yes/no");
                      String choice = scan.nextLine();
                      if (choice.equalsIgnoreCase("Y")) {
                        myCondition = true;
                      } else {
                        myCondition = false;
                      }
    
                 } while (myCondition);
    
    字节计数器=1;
    布尔myCondition=false;
    扫描仪扫描=新扫描仪(System.in);
    List myList=new ArrayList();
    做{
    System.out.println(“输入#“+计数器+”人名:”;
    //低质量验证
    String dude=scan.nextLine();
    while(myList.contains(dude)){
    System.out.println(“伙计,这个家伙:+dude+”已经加载到列表中了!请选择另一个名称:\n”);
    }
    我的列表。添加(都德);
    计数器++;
    System.out.println(“是否要在列表中添加其他名称?是/否”);
    字符串选择=scan.nextLine();
    if(选择相等信号情况(“Y”)){
    myCondition=true;
    }否则{
    真菌病=假;
    }
    }while(myCondition);
    

    在我退出程序之前,我运行了它,总共输入了七个名字。

    似乎确实是你的问题。我认为使用
    Scanner
    会让一切变得更容易。对不起,我只是在学习,但我认为Scanner是用来读取文件而不是控制台输入的。我错了吗?我想使用最好的方法。Scanner用于读取输入流,其中包括标准输入。我尝试使用Scanner,它做了相同的事情:SY您的问题是您通过BufferedReader(缓冲区)和System.in(缓冲区)混合输入,而System.in正是BufferedReader试图缓冲的。不要那样做,它不起作用。由@Jeremy Heiler删除的答案可能会导致一个答案,也许不会立即,或者像一些海报所建议的那样,通过一个单独的东西,比如扫描仪来完成。很有趣,但当我这样做时:char myChar=(char)objReader.readLine();它不允许我将字符串强制转换为char。我想我将不得不告别char变量,转而使用字符串。我想使用单个字符,但我不知道如何使用。如果您确定缓冲区中始终有1个字符后跟“\n”,请使用:String line=objReader.readLine();char myChar=line.charAt(0);