while循环使用.hasNext条件无限运行

时间:2016-03-18 21:48:00

标签: java

我知道在StackOverflow上已经多次询问过这个问题,但是我尝试了很多不同的解决方案,而且没有一个能够解决问题。所以我决定向社区询问该怎么做。以下是我的代码中的相关代码段。

public class Calculator
{
  public static void main(String[]args)
  {
     ArrayList<String> inputStorage = new ArrayList<String>();
     Scanner input = new Scanner(System.in);
     String rawInput;
     boolean mainLoop = true;

     String exitInput;
     String mainMenuInput;

     while(mainLoop == true)
     {
        mainMenuInput = input.nextLine()
        switch(mainMenuInput)
        {
           case "Expression":
               System.out.println("Type an expression");
               while(input.hasNext)
               {
                  rawInput = input.next();
                  inputStorage.add(rawInput);
               }
               break;

           case "Equation":
               System.out.println("Type an equation");
               while(input.hasNext)
               {
                  rawInput = input.next();
                  inputStorage.add(rawInput);
               }
               break;
          case "exit":
              System.out.println("Are you sure you want to exit")
              exitInput = input.nextLine();
              switch(exitInput)
              {
                 case "yes":
                 case "Yes":
                 mainLoop = false;

                 case "no":
                 case "No":
                 break;

                 default:
                 System.out.println("That was not an option")
                 break;
              }
          default:
                 System.out.println("That was not an option");
                 break;

        }
     }

请注意,这只是我的代码的一部分,它从控制台输入,不包含任何其他内容。我有其他设置要求代码采用这种格式。

以下列出了我尝试过但没有效果的内容:

  • 将input.hasNext()替换为input.hasNextLine()
  • 用input.next()!= null
  • 替换input.hasNext()
  • 如果input.next = null
  • ,则退出条件 如果input.next()=“\ n”,则
  • 制作退出条件
  • 如果input.next()=“\ r”
  • ,则退出条件

以下列出了对我的其余代码不起作用的内容:

  • BufferedReader(以及它的所有方法和方面)
  • 用input.nextLine()
  • 替换input.next()

话虽如此,我已经看到了一种方法,通过根据字符newLine的ASKII值创建退出条件。唯一的问题是我发现没有很好的方法将字符的ASKII值实现到java代码中(或者至少没有一个可以用于我的代码),为了实现它,我需要知道Scanner类如何使用下一行字符。但这只是一个建议的解决方案,我确信有人有更好的方法在按下enter时结束这样的输入循环。

感谢您的时间。

3 个答案:

答案 0 :(得分:8)

最后你永远不会将mainLoop设置为false。您实际上并不需要嵌套while循环,只需要包含hasNext

的循环

答案 1 :(得分:0)

由于您的Scanner正在处理已打开的流(System.in),因此无法确定此流未处于创建和发送更多数据的过程中,这意味着它无法返回虚假,直到

  • 这样的流将被关闭
  • 我们将收到代表流结束的数据。

因为那个

while(input.hasNext()){
    ...
}

是个糟糕的主意,因为在您获得正确的数据(或strim将被关闭)之前,您被hasNext()阻止。

正确的解决方案取决于您的方案。如果您知道要阅读的数字,请使用

for (int i = 0; i < N; i++){
    ...
    rawInput = input.next();
    ...
}

在您只想从一行处理令牌的场景中,您可以先读取该行,然后使用单独的扫描仪对其进行标记

Scanner lineScanner  = new Scanner(input.nextLine());
while(lineScanner.hasNext()){
    rawInput = lineScanner.next();
    inputStorage.add(rawInput);
}

答案 2 :(得分:0)

如果它应该使用读取行,你可以试试这个:

ctime