Infinite loop on Scanner.hasNext, reading from a file

后端 未结 3 1485
野的像风
野的像风 2021-01-22 17:32

I\'m apparently facing an infinite loop on while(input.hasNext()) , as in following code

File file = new File(\"data.txt\");
Scanner input = new Sca         


        
相关标签:
3条回答
  • 2021-01-22 17:38

    You do not need to double checking on content. this should work:

       File file = new File("data.txt");
        Scanner input = new Scanner(file);
    
        int sum = 0;
    
        while(input.hasNextInt()) {
                sum += input.nextInt();
        }
        System.out.println(sum);
    

    Hope this helps.

    0 讨论(0)
  • 2021-01-22 17:44

    Seems like scanner is reading a non int value from your file and when it does , while(input.hasNext()) will always be true because there is something as an input to scanner but it is not int. So scanner skips reading this non-int value in the inner if(input.hasNextInt()) check.

    So scanner does not proceed beyond this element and always return true.

    If you want to sum up all the integers in your file then you should modify your code to below:

    while(input.hasNext()) {            
                if(input.hasNextInt()) {                
                    sum += input.nextInt();
                }
                else
                    input.next();
            }
    

    Just read the non integer elements when scanner encouters it. Hope this clarifies.

    0 讨论(0)
  • 2021-01-22 17:45

    Well, according to

    while(input.hasNext()) {
      if(input.hasNextInt()) {
        sum += input.nextInt();
      }
    }
    

    Your scanner will not consume the next token if this token isn't an int, you can hilight this behavior with something like

    int k=0;
    while(input.hasNext()) {
      if(input.hasNextInt()) {
        sum += input.nextInt();
      } else {
        System.err.println("What ? It's not an integer...");
        if ( k < 1 ) {
          System.err.println("I'm gonna try again !");
          k++;
        } else {
          System.err.println("'"+input.next()+"' it's definitively not an integer");
          k=0;
        }
      }
    }
    

    Finally, there are many solutions, for example :

    • Modify your input file the remove all the non-integer token
    • Consume the non-integer token with Scanner::next()
    • Sanjeev's answer
    0 讨论(0)
提交回复
热议问题