title: Java scanner not working expectedly in loop
body: <p>I am writing a program to delete one of the field from a tab separated input table. And I need the user to give me the position of the field which they wish to delete.</p>
  
  <p>I want to keep asking for the number until it is valid so I wrote the following code (which is the code that I think caused problem): </p>
  
  <pre><code>  boolean validPos = false;
    int pos = -1;
    while(!validPos){
      System.out.print(
      "Please enter the postion of the field you want to delete: ");
      try{
        //index is 1 less than the number so - 1
        pos = ask.nextInt() - 1;
      }catch(InputMismatchException imE){
        System.err.println(imE);
        System.out.println("Please enter a valid positive integer");
      }
      if(pos &lt;= 0){
        System.out.println("Enter number is less than 1");
      }else{
        validPos = true;
      }//ifelse
    }//while
  </code></pre>
  
  <p>And when I entered an invalid input when it asked,
  it keeps on printing the same thing non-stop:</p>
  
  <pre><code>$ java DeleteField
  Leave empty if you want to manually enter input
  Please enter the name of input file: 
  Leave empty if you want to show the output here
  Please enter the name of the output file: 
  Please enter the postion of the field you want to delete: q
  java.util.InputMismatchException
  Please enter a valid positive integer
  Enter number is less than 1
  Please enter the postion of the field you want to delete:     java.util.InputMismatchException
  Please enter a valid positive integer
  Enter number is less than 1
  Please enter the postion of the field you want to delete:    java.util.InputMismatchException
  Please enter a valid positive integer
  Enter number is less than 1
  Please enter the postion of the field you want to delete:  java.util.InputMismatchException
  Please enter a valid positive integer
  Enter number is less than 1
  Please enter the postion of the field you want to delete:   java.util.InputMismatchException
  </code></pre>
  
  <p>.... and so on printing forever...
  It seems like the code</p>
  
  <pre><code>pos = ask.nextInt() - 1;  
  </code></pre>
  
  <p>did not stop and asked for an input, 
  May I know what happened? Thanks alot
  <br><br>
  And if you want to see the full code :</p>
  
  <pre><code>//this program input a tab separated table
  //and delete one of the field according to input number
  //note: if input number is more than integer range it wont work
  
  import java.io.IOException;
  import java.io.FileReader;
  import java.io.FileWriter;
  import java.io.BufferedReader;
  import java.io.PrintWriter;
  import java.util.Scanner;
  import java.io.File;
  import java.io.InputStreamReader;
  import java.util.InputMismatchException;
  
  public class DeleteField{
    public static void main(String[] args) {
      BufferedReader reader = null;
      PrintWriter writer = null;
      Scanner ask = new Scanner(System.in);
      boolean standardInput = false;
      boolean standardOutput = false;
      File inFile = null;
      File outFile = null;
  
  try{
    boolean validInFile = false;
    while(!validInFile){
      System.out.println("Leave empty if you want to manually enter input");
      System.out.print("Please enter the name of input file: ");
      String inFileString = ask.nextLine();
      inFile = new File(inFileString);
      if(inFileString.equals("")){
        standardInput = validInFile = true;
      }else if(!inFile.exists()){
        System.out.println("This file does not exists, please enter again");
      }else{
        validInFile = true;
      }//ifelse
    }//while
  
    boolean validOutFile = false;
    while(!validOutFile){
      System.out.println("Leave empty if you want to show the output here");
      System.out.print("Please enter the name of the output file: ");
      String outFileString = ask.nextLine();
      outFile = new File(outFileString);
      if(outFileString.equals("")){
        standardOutput = validOutFile = true;
      }else if(outFile.exists()){
        boolean validAns = false;
        while(!validAns){
          System.out.print("File already exists, override it? (y/n): ");
          String ans = ask.nextLine();
          if(ans.equals("y")){
            validAns = validOutFile = true;
          }else if(ans.equals("n")){
            standardOutput = validAns = true;
          }else{
            System.out.println("Please supply valid answer");
          }//else
        }//while
      }else{
        validOutFile = true;
      }//else
    }//while
    /////////////////////////////////////////////////////////////////
    //The code I think with problem: 
    boolean validPos = false;
    int pos = -1;
    while(!validPos){
      System.out.print(
      "Please enter the postion of the field you want to delete: ");
      try{
        pos = ask.nextInt() - 1;
      }catch(InputMismatchException imE){
        System.err.println(imE);
        System.out.println("Please enter a valid positive integer");
      }
      if(pos &lt;= 0){
        System.out.println("Enter number is less than 1");
      }else{
        validPos = true;
      }//ifelse
    }//while
  
    /////////////////////////////////////////////////////////////////
    if(standardInput){
      reader = new BufferedReader(new InputStreamReader(System.in));
    }else{
      reader = new BufferedReader(new FileReader(inFile));
    }
  
    if(!standardOutput){
      writer = new PrintWriter(new FileWriter(outFile));
    }
  
    String currLine;
    String res = "";//result
    boolean deleted = false;
    final String NLS = System.getProperty("line.separator");
    //read linebyline from input
    //if pos == index then skip
    //else paste each words of the line into result
    while((currLine = reader.readLine()) != null){
      String[] currLineArray = currLine.split("\t");
      for(int index = 0; index &lt; currLineArray.length; index++){
        if(index != pos){
          res += currLineArray[index] + "\t";
        }else{//if we deleted something
          deleted = true;
        }//if
      }//for
      res += NLS;
    }//while
  
    //output result
    if(standardOutput){
      System.out.println(res);
    }else{
      writer.write(res);
    }
    if(!deleted){
      writer.write("Note: You did not delete any field");
    }//if
  
  }catch(IllegalArgumentException illE){
    System.err.println("Error: " + illE.getMessage());
    System.out.println(
    "Please try again with argument as inFile outFile integer");
  // }catch(IOException ioE){
  //   System.err.println("Error: " + ioE.getMessage());
  }catch(Exception e){
    System.err.println(e);
    System.err.println("Something unforseen happened...");
  }finally{
    try{
      if(reader != null) reader.close();
    }catch(IOException ioe){
      System.out.println("Error while closing file");
      System.err.println(ioe);
    }catch(Exception e){
      System.out.println(
            "Something unforeseen happened during closing file");
      System.err.println(e);
    }
    if(writer != null){
      writer.close();
      if(writer.checkError())
        System.err.println("Something went wrong with the output");
    }
  }//trycatchfinally
  }//main
  }//class
  </code></pre>