Scanner is skipping nextLine() after using next() or nextFoo()?












537















I am using the Scanner methods nextInt() and nextLine() for reading input.



It looks like this:



System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)


The problem is that after entering the numerical value, the first input.nextLine() is skipped and the second input.nextLine() is executed, so that my output looks like this:



Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string // ...and this line is executed and waits for my input


I tested my application and it looks like the problem lies in using input.nextInt(). If I delete it, then both string1 = input.nextLine() and string2 = input.nextLine() are executed as I want them to be.










share|improve this question




















  • 4





    Related: stackoverflow.com/questions/4708219/…

    – James P.
    Aug 14 '11 at 12:27






  • 25





    The newline character is probably not consumed.

    – Lews Therin
    Oct 27 '12 at 16:39






  • 5





    Style note: you should declare your String variables on the same line you assign a value. E.g. String string1 = input.nextLine ().

    – Duncan Jones
    Oct 27 '12 at 16:39






  • 2





    @Lews Therin: Yes, you are right. After another couple of test I found that it is executed and read "n". How to avoid of that?

    – blekione
    Oct 27 '12 at 16:45






  • 3





    Or you could be like me and use BufferedReader :) I don't care if it's old school, it has always worked and always will work for me. Also, knowledge of BufferedReader has application elsewhere. I simply don't like Scanner.

    – Cruncher
    Aug 27 '13 at 19:36
















537















I am using the Scanner methods nextInt() and nextLine() for reading input.



It looks like this:



System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)


The problem is that after entering the numerical value, the first input.nextLine() is skipped and the second input.nextLine() is executed, so that my output looks like this:



Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string // ...and this line is executed and waits for my input


I tested my application and it looks like the problem lies in using input.nextInt(). If I delete it, then both string1 = input.nextLine() and string2 = input.nextLine() are executed as I want them to be.










share|improve this question




















  • 4





    Related: stackoverflow.com/questions/4708219/…

    – James P.
    Aug 14 '11 at 12:27






  • 25





    The newline character is probably not consumed.

    – Lews Therin
    Oct 27 '12 at 16:39






  • 5





    Style note: you should declare your String variables on the same line you assign a value. E.g. String string1 = input.nextLine ().

    – Duncan Jones
    Oct 27 '12 at 16:39






  • 2





    @Lews Therin: Yes, you are right. After another couple of test I found that it is executed and read "n". How to avoid of that?

    – blekione
    Oct 27 '12 at 16:45






  • 3





    Or you could be like me and use BufferedReader :) I don't care if it's old school, it has always worked and always will work for me. Also, knowledge of BufferedReader has application elsewhere. I simply don't like Scanner.

    – Cruncher
    Aug 27 '13 at 19:36














537












537








537


245






I am using the Scanner methods nextInt() and nextLine() for reading input.



It looks like this:



System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)


The problem is that after entering the numerical value, the first input.nextLine() is skipped and the second input.nextLine() is executed, so that my output looks like this:



Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string // ...and this line is executed and waits for my input


I tested my application and it looks like the problem lies in using input.nextInt(). If I delete it, then both string1 = input.nextLine() and string2 = input.nextLine() are executed as I want them to be.










share|improve this question
















I am using the Scanner methods nextInt() and nextLine() for reading input.



It looks like this:



System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)


The problem is that after entering the numerical value, the first input.nextLine() is skipped and the second input.nextLine() is executed, so that my output looks like this:



Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string // ...and this line is executed and waits for my input


I tested my application and it looks like the problem lies in using input.nextInt(). If I delete it, then both string1 = input.nextLine() and string2 = input.nextLine() are executed as I want them to be.







java io java.util.scanner






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 4 '18 at 13:31









Lii

6,88544159




6,88544159










asked Oct 27 '12 at 16:37









blekioneblekione

3,00131016




3,00131016








  • 4





    Related: stackoverflow.com/questions/4708219/…

    – James P.
    Aug 14 '11 at 12:27






  • 25





    The newline character is probably not consumed.

    – Lews Therin
    Oct 27 '12 at 16:39






  • 5





    Style note: you should declare your String variables on the same line you assign a value. E.g. String string1 = input.nextLine ().

    – Duncan Jones
    Oct 27 '12 at 16:39






  • 2





    @Lews Therin: Yes, you are right. After another couple of test I found that it is executed and read "n". How to avoid of that?

    – blekione
    Oct 27 '12 at 16:45






  • 3





    Or you could be like me and use BufferedReader :) I don't care if it's old school, it has always worked and always will work for me. Also, knowledge of BufferedReader has application elsewhere. I simply don't like Scanner.

    – Cruncher
    Aug 27 '13 at 19:36














  • 4





    Related: stackoverflow.com/questions/4708219/…

    – James P.
    Aug 14 '11 at 12:27






  • 25





    The newline character is probably not consumed.

    – Lews Therin
    Oct 27 '12 at 16:39






  • 5





    Style note: you should declare your String variables on the same line you assign a value. E.g. String string1 = input.nextLine ().

    – Duncan Jones
    Oct 27 '12 at 16:39






  • 2





    @Lews Therin: Yes, you are right. After another couple of test I found that it is executed and read "n". How to avoid of that?

    – blekione
    Oct 27 '12 at 16:45






  • 3





    Or you could be like me and use BufferedReader :) I don't care if it's old school, it has always worked and always will work for me. Also, knowledge of BufferedReader has application elsewhere. I simply don't like Scanner.

    – Cruncher
    Aug 27 '13 at 19:36








4




4





Related: stackoverflow.com/questions/4708219/…

– James P.
Aug 14 '11 at 12:27





Related: stackoverflow.com/questions/4708219/…

– James P.
Aug 14 '11 at 12:27




25




25





The newline character is probably not consumed.

– Lews Therin
Oct 27 '12 at 16:39





The newline character is probably not consumed.

– Lews Therin
Oct 27 '12 at 16:39




5




5





Style note: you should declare your String variables on the same line you assign a value. E.g. String string1 = input.nextLine ().

– Duncan Jones
Oct 27 '12 at 16:39





Style note: you should declare your String variables on the same line you assign a value. E.g. String string1 = input.nextLine ().

– Duncan Jones
Oct 27 '12 at 16:39




2




2





@Lews Therin: Yes, you are right. After another couple of test I found that it is executed and read "n". How to avoid of that?

– blekione
Oct 27 '12 at 16:45





@Lews Therin: Yes, you are right. After another couple of test I found that it is executed and read "n". How to avoid of that?

– blekione
Oct 27 '12 at 16:45




3




3





Or you could be like me and use BufferedReader :) I don't care if it's old school, it has always worked and always will work for me. Also, knowledge of BufferedReader has application elsewhere. I simply don't like Scanner.

– Cruncher
Aug 27 '13 at 19:36





Or you could be like me and use BufferedReader :) I don't care if it's old school, it has always worked and always will work for me. Also, knowledge of BufferedReader has application elsewhere. I simply don't like Scanner.

– Cruncher
Aug 27 '13 at 19:36












15 Answers
15






active

oldest

votes


















634














That's because the Scanner.nextInt method does not read the newline character in your input created by hitting "Enter," and so the call to Scanner.nextLine returns after reading that newline.



You will encounter the similar behaviour when you use Scanner.nextLine after Scanner.next() or any Scanner.nextFoo method (except nextLine itself).



Workaround:





  • Either put a Scanner.nextLine call after each Scanner.nextInt or Scanner.nextFoo to consume rest of that line including newline



    int option = input.nextInt();
    input.nextLine(); // Consume newline left-over
    String str1 = input.nextLine();



  • Or, even better, read the input through Scanner.nextLine and convert your input to the proper format you need. For example, you may convert to an integer using Integer.parseInt(String) method.



    int option = 0;
    try {
    option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
    e.printStackTrace();
    }
    String str1 = input.nextLine();







share|improve this answer


























  • Couldn't I use only option = Integer.parseInt(input.nextLine());} instead of full try{...}? Is there any weakness of using only above?

    – blekione
    Oct 27 '12 at 17:52








  • 3





    @blekione. You have to use try-catch, because Integer.parseInt throws NumberFormatException when an invalid argument is passed to it. You will learn about exception later on. For E.G: - Integer.parseInt("abc"). You don't want "abc" to get converted to int right?

    – Rohit Jain
    Oct 27 '12 at 18:02






  • 3





    @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.

    – Rohit Jain
    Oct 27 '12 at 18:02






  • 4





    To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.

    – Mordechai
    Jan 11 '17 at 3:00








  • 1





    I personally prefer a Scanner#hasNextFoo check beforehand instead of a try-catch, but that works too.

    – MildlyMilquetoast
    Jan 22 '17 at 1:13



















179














The problem is with the input.nextInt() method - it only reads the int value. So when you continue reading with input.nextLine() you receive the "n" Enter key. So to skip this you have to add the input.nextLine(). Hope this should be clear now.



Try it like that:



System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();





share|improve this answer


























  • umm seems a solution, making the skipped line non-used nextLine, but I still need an explanation of this behaviour

    – Eng.Fouad
    Aug 14 '11 at 12:25








  • 2





    FYI: merged from stackoverflow.com/questions/7056749/…

    – Shog9
    Nov 13 '14 at 19:11



















69














It's because when you enter a number then press Enter, input.nextInt() consumes only the number, not the "end of line". When input.nextLine() executes, it consumes the "end of line" still in the buffer from the first input.



Instead, use input.nextLine() immediately after input.nextInt()






share|improve this answer
























  • Mmm, that bug was corrected in now a days?

    – Victor
    May 29 '14 at 13:28








  • 7





    @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input.

    – Bohemian
    May 29 '14 at 13:38











  • I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP.

    – Victor
    May 29 '14 at 14:55











  • @victor You can request (and find out how to contribute code to) a feature via the Report a Bug or Request a Feature page.

    – Bohemian
    May 29 '14 at 15:18











  • FYI: merged from stackoverflow.com/questions/7056749/…

    – Shog9
    Nov 13 '14 at 19:12



















37














There seem to be many questions about this issue with java.util.Scanner. I think a more readable/idiomatic solution would be to call scanner.skip("[rn]+") to drop any newline characters after calling nextInt().



EDIT: as @PatrickParker noted below, this will cause an infinite loop if user inputs any whitespace after the number. See their answer for a better pattern to use with skip: https://stackoverflow.com/a/42471816/143585






share|improve this answer


























  • FYI: merged from stackoverflow.com/questions/7056749/…

    – Shog9
    Nov 13 '14 at 19:12











  • I know what we do to remove the data in buffer, but this case, please help me with this: stackoverflow.com/questions/33585314/having-issues-with-scanner

    – Khuong
    Nov 7 '15 at 18:03











  • FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: stackoverflow.com/a/42471816/7098259

    – Patrick Parker
    Feb 26 '17 at 17:52











  • @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours.

    – Denis Tulskiy
    Feb 27 '17 at 5:57











  • @PatrickParker Why does is cause infinite loop ?

    – Piyush
    Aug 19 '17 at 8:41



















27














It does that because input.nextInt(); doesn't capture the newline. you could do like the others proposed by adding an input.nextLine(); underneath.

Alternatively you can do it C# style and parse a nextLine to an integer like so:



int number = Integer.parseInt(input.nextLine()); 


Doing this works just as well, and it saves you a line of code.






share|improve this answer
























  • FYI: merged from stackoverflow.com/questions/7056749/…

    – Shog9
    Nov 13 '14 at 19:12



















19














Things you need to know:





  • text which represents few lines also contains non-printable characters between lines (we call them line separators) like




    • carriage return (CR - in String literals represented as "r")

    • line feed (LF - in String literals represented as "n")




  • when you are reading data from the console, it allows the user to type his response and when he is done he needs to somehow confirm that fact. To do so, the user is required to press "enter"/"return" key on the keyboard.



    What is important is that this key beside ensuring placing user data to standard input (represented by System.in which is read by Scanner) also sends OS dependant line separators (like for Windows rn) after it.



    So when you are asking the user for value like age, and user types 42 and presses enter, standard input will contain "42rn".




Problem



Scanner#nextInt (and other Scanner#nextType methods) doesn't allow Scanner to consume these line separators. It will read them from System.in (how else Scanner would know that there are no more digits from the user which represent age value than facing whitespace?) which will remove them from standard input, but it will also cache those line separators internally. What we need to remember, is that all of the Scanner methods are always scanning starting from the cached text.



Now Scanner#nextLine() simply collects and returns all characters until it finds line separators (or end of stream). But since line separators after reading the number from the console are found immediately in Scanner's cache, it returns empty String, meaning that Scanner was not able to find any character before those line separators (or end of stream).

BTW nextLine also consumes those line separators.



Solution



So when you want to ask for number and then for entire line while avoiding that empty string as result of nextLine, either




  • consume line separator left by nextInt from Scanners cache by


    • calling nextLine,

    • or by calling skip("\R") to let Scanner skip part matched by R which represents line separator (more info about R: https://stackoverflow.com/a/31060125)



  • don't use nextInt (nor next, or any nextTYPE methods) at all. Instead read entire data line-by-line using nextLine and parse numbers from each line (assuming one line contains only one number) to proper type like int via Integer.parseInt.




BTW: Scanner#nextType methods can skip delimiters (by default all whitespaces like tabs, line separators) including those cached by scanner, until they will find next non-delimiter value (token). Thanks to that for input like "42rnrn321rnrnrnfoobar" code



int num1 = sc.nextInt();
int num2 = sc.nextInt();
String name = sc.next();


will be able to properly assign num1=42 num2=321 name=foobar.






share|improve this answer

































    7














    Instead of input.nextLine() use input.next(), that should solve the problem.



    Modified code:



    public static Scanner input = new Scanner(System.in);

    public static void main(String args)
    {
    System.out.print("Insert a number: ");
    int number = input.nextInt();
    System.out.print("Text1: ");
    String text1 = input.next();
    System.out.print("Text2: ");
    String text2 = input.next();
    }





    share|improve this answer


























    • FYI: merged from stackoverflow.com/questions/7056749/…

      – Shog9
      Nov 13 '14 at 19:12



















    7














    In order to avoid the issue, use nextLine(); immediately after nextInt(); as it helps in clearing out the buffer. When you press ENTER the nextInt(); does not capture the new line and hence, skips the Scanner code later.



    Scanner scanner =  new Scanner(System.in);
    int option = scanner.nextInt();
    scanner.nextLine(); //clearing the buffer





    share|improve this answer































      7














      If you want to scan input fast without getting confused into Scanner class nextLine() method , Use Custom Input Scanner for it .



      Code :



      class ScanReader {
      /**
      * @author Nikunj Khokhar
      */
      private byte buf = new byte[4 * 1024];
      private int index;
      private BufferedInputStream in;
      private int total;

      public ScanReader(InputStream inputStream) {
      in = new BufferedInputStream(inputStream);
      }

      private int scan() throws IOException {
      if (index >= total) {
      index = 0;
      total = in.read(buf);
      if (total <= 0) return -1;
      }
      return buf[index++];
      }
      public char scanChar(){
      int c=scan();
      while (isWhiteSpace(c))c=scan();
      return (char)c;
      }


      public int scanInt() throws IOException {
      int integer = 0;
      int n = scan();
      while (isWhiteSpace(n)) n = scan();
      int neg = 1;
      if (n == '-') {
      neg = -1;
      n = scan();
      }
      while (!isWhiteSpace(n)) {
      if (n >= '0' && n <= '9') {
      integer *= 10;
      integer += n - '0';
      n = scan();
      }
      }
      return neg * integer;
      }

      public String scanString() throws IOException {
      int c = scan();
      while (isWhiteSpace(c)) c = scan();
      StringBuilder res = new StringBuilder();
      do {
      res.appendCodePoint(c);
      c = scan();
      } while (!isWhiteSpace(c));
      return res.toString();
      }

      private boolean isWhiteSpace(int n) {
      if (n == ' ' || n == 'n' || n == 'r' || n == 't' || n == -1) return true;
      else return false;
      }

      public long scanLong() throws IOException {
      long integer = 0;
      int n = scan();
      while (isWhiteSpace(n)) n = scan();
      int neg = 1;
      if (n == '-') {
      neg = -1;
      n = scan();
      }
      while (!isWhiteSpace(n)) {
      if (n >= '0' && n <= '9') {
      integer *= 10;
      integer += n - '0';
      n = scan();
      }
      }
      return neg * integer;
      }

      public void scanLong(long A) throws IOException {
      for (int i = 0; i < A.length; i++) A[i] = scanLong();
      }

      public void scanInt(int A) throws IOException {
      for (int i = 0; i < A.length; i++) A[i] = scanInt();
      }

      public double scanDouble() throws IOException {
      int c = scan();
      while (isWhiteSpace(c)) c = scan();
      int sgn = 1;
      if (c == '-') {
      sgn = -1;
      c = scan();
      }
      double res = 0;
      while (!isWhiteSpace(c) && c != '.') {
      if (c == 'e' || c == 'E') {
      return res * Math.pow(10, scanInt());
      }
      res *= 10;
      res += c - '0';
      c = scan();
      }
      if (c == '.') {
      c = scan();
      double m = 1;
      while (!isWhiteSpace(c)) {
      if (c == 'e' || c == 'E') {
      return res * Math.pow(10, scanInt());
      }
      m /= 10;
      res += (c - '0') * m;
      c = scan();
      }
      }
      return res * sgn;
      }

      }


      Advantages :




      • Scans Input faster than BufferReader

      • Reduces Time Complexity

      • Flushes Buffer for every next input


      Methods :




      • scanChar() - scan single character

      • scanInt() - scan Integer value

      • scanLong() - scan Long value

      • scanString() - scan String value

      • scanDouble() - scan Double value

      • scanInt(int array) - scans complete Array(Integer)

      • scanLong(long array) - scans complete Array(Long)


      Usage :




      1. Copy the Given Code below your java code.

      2. Initialise Object for Given Class


      ScanReader sc = new ScanReader(System.in);

      3. Import necessary Classes :



      import java.io.BufferedInputStream;
      import java.io.IOException;
      import java.io.InputStream;

      4. Throw IOException from your main method to handle Exception
      5. Use Provided Methods.
      6. Enjoy



      Example :



      import java.io.BufferedInputStream;
      import java.io.IOException;
      import java.io.InputStream;
      class Main{
      public static void main(String... as) throws IOException{
      ScanReader sc = new ScanReader(System.in);
      int a=sc.scanInt();
      System.out.println(a);
      }
      }
      class ScanReader....





      share|improve this answer































        5














        sc.nextLine() is better as compared to parsing the input.
        Because performance wise it will be good.






        share|improve this answer

































          4














          If you want to read both strings and ints, a solution is to use two Scanners:



          Scanner stringScanner = new Scanner(System.in);
          Scanner intScanner = new Scanner(System.in);

          intScanner.nextInt();
          String s = stringScanner.nextLine(); // unaffected by previous nextInt()
          System.out.println(s);

          intScanner.close();
          stringScanner.close();





          share|improve this answer































            1














            I guess I'm pretty late to the party..



            As previously stated, calling input.nextLine() after getting your int value will solve your problem. The reason why your code didn't work was because there was nothing else to store from your input (where you inputted the int) into string1. I'll just shed a little more light to the entire topic.



            Consider nextLine() as the odd one out among the nextFoo() methods in the Scanner class. Let's take a quick example.. Let's say we have two lines of code like the ones below:



            int firstNumber = input.nextInt();
            int secondNumber = input.nextInt();


            If we input the value below (as a single line of input)




            54 234




            The value of our firstNumber and secondNumber variable become 54 and 234 respectively. The reason why this works this way is because a new line feed (i.e n) IS NOT automatically generated when the nextInt() method takes in the values. It simply takes the "next int" and moves on. This is the same for the rest of the nextFoo() methods except nextLine().



            nextLine() generates a new line feed immediately after taking a value; this is what @RohitJain means by saying the new line feed is "consumed".



            Lastly, the next() method simply takes the nearest String without generating a new line; this makes this the preferential method for taking separate Strings within the same single line.



            I hope this helps.. Merry coding!






            share|improve this answer


























            • what is a "new line feed"?

              – Abcd
              Jan 13 at 16:22











            • @Abcd A new line feed basically means 'starting from a new line'.

              – Taslim
              Jan 13 at 19:35



















            0














            public static void main(String args) {
            Scanner scan = new Scanner(System.in);
            int i = scan.nextInt();
            scan.nextLine();
            double d = scan.nextDouble();
            scan.nextLine();
            String s = scan.nextLine();

            System.out.println("String: " + s);
            System.out.println("Double: " + d);
            System.out.println("Int: " + i);
            }





            share|improve this answer
























            • If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

              – Neeraj Gahlawat
              Jul 30 '17 at 3:50



















            -1














            Use 2 scanner objects instead of one



            Scanner input = new Scanner(System.in);
            System.out.println("Enter numerical value");
            int option;
            Scanner input2 = new Scanner(System.in);
            option = input2.nextInt();





            share|improve this answer































              -2














              Why not use a new Scanner for every reading? Like below. With this approach you will not confront your problem.



              int i = new Scanner(System.in).nextInt();





              share|improve this answer



















              • 1





                But then you have to close the Scanner to prevent memory leak. Wasting time?

                – TheCoffeeCup
                Oct 8 '15 at 1:22











              • Doesn't the GC take care of that if the Scanner is wrapped in a method? Like: String getInput() {return new Scanner(System.in).nextLine()};

                – Tobias Johansson
                Jun 1 '16 at 22:14











              • This is absolutely incorrect. nextInt() won't consume the newline, regardless of whether it's in a "new" Scanner or an already used one.

                – Dawood ibn Kareem
                Dec 29 '16 at 20:55












              protected by Aniket Thakur Apr 19 '15 at 9:05



              Thank you for your interest in this question.
              Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).



              Would you like to answer one of these unanswered questions instead?














              15 Answers
              15






              active

              oldest

              votes








              15 Answers
              15






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              634














              That's because the Scanner.nextInt method does not read the newline character in your input created by hitting "Enter," and so the call to Scanner.nextLine returns after reading that newline.



              You will encounter the similar behaviour when you use Scanner.nextLine after Scanner.next() or any Scanner.nextFoo method (except nextLine itself).



              Workaround:





              • Either put a Scanner.nextLine call after each Scanner.nextInt or Scanner.nextFoo to consume rest of that line including newline



                int option = input.nextInt();
                input.nextLine(); // Consume newline left-over
                String str1 = input.nextLine();



              • Or, even better, read the input through Scanner.nextLine and convert your input to the proper format you need. For example, you may convert to an integer using Integer.parseInt(String) method.



                int option = 0;
                try {
                option = Integer.parseInt(input.nextLine());
                } catch (NumberFormatException e) {
                e.printStackTrace();
                }
                String str1 = input.nextLine();







              share|improve this answer


























              • Couldn't I use only option = Integer.parseInt(input.nextLine());} instead of full try{...}? Is there any weakness of using only above?

                – blekione
                Oct 27 '12 at 17:52








              • 3





                @blekione. You have to use try-catch, because Integer.parseInt throws NumberFormatException when an invalid argument is passed to it. You will learn about exception later on. For E.G: - Integer.parseInt("abc"). You don't want "abc" to get converted to int right?

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 3





                @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 4





                To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.

                – Mordechai
                Jan 11 '17 at 3:00








              • 1





                I personally prefer a Scanner#hasNextFoo check beforehand instead of a try-catch, but that works too.

                – MildlyMilquetoast
                Jan 22 '17 at 1:13
















              634














              That's because the Scanner.nextInt method does not read the newline character in your input created by hitting "Enter," and so the call to Scanner.nextLine returns after reading that newline.



              You will encounter the similar behaviour when you use Scanner.nextLine after Scanner.next() or any Scanner.nextFoo method (except nextLine itself).



              Workaround:





              • Either put a Scanner.nextLine call after each Scanner.nextInt or Scanner.nextFoo to consume rest of that line including newline



                int option = input.nextInt();
                input.nextLine(); // Consume newline left-over
                String str1 = input.nextLine();



              • Or, even better, read the input through Scanner.nextLine and convert your input to the proper format you need. For example, you may convert to an integer using Integer.parseInt(String) method.



                int option = 0;
                try {
                option = Integer.parseInt(input.nextLine());
                } catch (NumberFormatException e) {
                e.printStackTrace();
                }
                String str1 = input.nextLine();







              share|improve this answer


























              • Couldn't I use only option = Integer.parseInt(input.nextLine());} instead of full try{...}? Is there any weakness of using only above?

                – blekione
                Oct 27 '12 at 17:52








              • 3





                @blekione. You have to use try-catch, because Integer.parseInt throws NumberFormatException when an invalid argument is passed to it. You will learn about exception later on. For E.G: - Integer.parseInt("abc"). You don't want "abc" to get converted to int right?

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 3





                @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 4





                To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.

                – Mordechai
                Jan 11 '17 at 3:00








              • 1





                I personally prefer a Scanner#hasNextFoo check beforehand instead of a try-catch, but that works too.

                – MildlyMilquetoast
                Jan 22 '17 at 1:13














              634












              634








              634







              That's because the Scanner.nextInt method does not read the newline character in your input created by hitting "Enter," and so the call to Scanner.nextLine returns after reading that newline.



              You will encounter the similar behaviour when you use Scanner.nextLine after Scanner.next() or any Scanner.nextFoo method (except nextLine itself).



              Workaround:





              • Either put a Scanner.nextLine call after each Scanner.nextInt or Scanner.nextFoo to consume rest of that line including newline



                int option = input.nextInt();
                input.nextLine(); // Consume newline left-over
                String str1 = input.nextLine();



              • Or, even better, read the input through Scanner.nextLine and convert your input to the proper format you need. For example, you may convert to an integer using Integer.parseInt(String) method.



                int option = 0;
                try {
                option = Integer.parseInt(input.nextLine());
                } catch (NumberFormatException e) {
                e.printStackTrace();
                }
                String str1 = input.nextLine();







              share|improve this answer















              That's because the Scanner.nextInt method does not read the newline character in your input created by hitting "Enter," and so the call to Scanner.nextLine returns after reading that newline.



              You will encounter the similar behaviour when you use Scanner.nextLine after Scanner.next() or any Scanner.nextFoo method (except nextLine itself).



              Workaround:





              • Either put a Scanner.nextLine call after each Scanner.nextInt or Scanner.nextFoo to consume rest of that line including newline



                int option = input.nextInt();
                input.nextLine(); // Consume newline left-over
                String str1 = input.nextLine();



              • Or, even better, read the input through Scanner.nextLine and convert your input to the proper format you need. For example, you may convert to an integer using Integer.parseInt(String) method.



                int option = 0;
                try {
                option = Integer.parseInt(input.nextLine());
                } catch (NumberFormatException e) {
                e.printStackTrace();
                }
                String str1 = input.nextLine();








              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Oct 31 '18 at 1:31









              TechnicallyTrue

              233




              233










              answered Oct 27 '12 at 16:39









              Rohit JainRohit Jain

              165k33310440




              165k33310440













              • Couldn't I use only option = Integer.parseInt(input.nextLine());} instead of full try{...}? Is there any weakness of using only above?

                – blekione
                Oct 27 '12 at 17:52








              • 3





                @blekione. You have to use try-catch, because Integer.parseInt throws NumberFormatException when an invalid argument is passed to it. You will learn about exception later on. For E.G: - Integer.parseInt("abc"). You don't want "abc" to get converted to int right?

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 3





                @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 4





                To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.

                – Mordechai
                Jan 11 '17 at 3:00








              • 1





                I personally prefer a Scanner#hasNextFoo check beforehand instead of a try-catch, but that works too.

                – MildlyMilquetoast
                Jan 22 '17 at 1:13



















              • Couldn't I use only option = Integer.parseInt(input.nextLine());} instead of full try{...}? Is there any weakness of using only above?

                – blekione
                Oct 27 '12 at 17:52








              • 3





                @blekione. You have to use try-catch, because Integer.parseInt throws NumberFormatException when an invalid argument is passed to it. You will learn about exception later on. For E.G: - Integer.parseInt("abc"). You don't want "abc" to get converted to int right?

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 3





                @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.

                – Rohit Jain
                Oct 27 '12 at 18:02






              • 4





                To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.

                – Mordechai
                Jan 11 '17 at 3:00








              • 1





                I personally prefer a Scanner#hasNextFoo check beforehand instead of a try-catch, but that works too.

                – MildlyMilquetoast
                Jan 22 '17 at 1:13

















              Couldn't I use only option = Integer.parseInt(input.nextLine());} instead of full try{...}? Is there any weakness of using only above?

              – blekione
              Oct 27 '12 at 17:52







              Couldn't I use only option = Integer.parseInt(input.nextLine());} instead of full try{...}? Is there any weakness of using only above?

              – blekione
              Oct 27 '12 at 17:52






              3




              3





              @blekione. You have to use try-catch, because Integer.parseInt throws NumberFormatException when an invalid argument is passed to it. You will learn about exception later on. For E.G: - Integer.parseInt("abc"). You don't want "abc" to get converted to int right?

              – Rohit Jain
              Oct 27 '12 at 18:02





              @blekione. You have to use try-catch, because Integer.parseInt throws NumberFormatException when an invalid argument is passed to it. You will learn about exception later on. For E.G: - Integer.parseInt("abc"). You don't want "abc" to get converted to int right?

              – Rohit Jain
              Oct 27 '12 at 18:02




              3




              3





              @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.

              – Rohit Jain
              Oct 27 '12 at 18:02





              @blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.

              – Rohit Jain
              Oct 27 '12 at 18:02




              4




              4





              To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.

              – Mordechai
              Jan 11 '17 at 3:00







              To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.

              – Mordechai
              Jan 11 '17 at 3:00






              1




              1





              I personally prefer a Scanner#hasNextFoo check beforehand instead of a try-catch, but that works too.

              – MildlyMilquetoast
              Jan 22 '17 at 1:13





              I personally prefer a Scanner#hasNextFoo check beforehand instead of a try-catch, but that works too.

              – MildlyMilquetoast
              Jan 22 '17 at 1:13













              179














              The problem is with the input.nextInt() method - it only reads the int value. So when you continue reading with input.nextLine() you receive the "n" Enter key. So to skip this you have to add the input.nextLine(). Hope this should be clear now.



              Try it like that:



              System.out.print("Insert a number: ");
              int number = input.nextInt();
              input.nextLine(); // This line you have to add (It consumes the n character)
              System.out.print("Text1: ");
              String text1 = input.nextLine();
              System.out.print("Text2: ");
              String text2 = input.nextLine();





              share|improve this answer


























              • umm seems a solution, making the skipped line non-used nextLine, but I still need an explanation of this behaviour

                – Eng.Fouad
                Aug 14 '11 at 12:25








              • 2





                FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:11
















              179














              The problem is with the input.nextInt() method - it only reads the int value. So when you continue reading with input.nextLine() you receive the "n" Enter key. So to skip this you have to add the input.nextLine(). Hope this should be clear now.



              Try it like that:



              System.out.print("Insert a number: ");
              int number = input.nextInt();
              input.nextLine(); // This line you have to add (It consumes the n character)
              System.out.print("Text1: ");
              String text1 = input.nextLine();
              System.out.print("Text2: ");
              String text2 = input.nextLine();





              share|improve this answer


























              • umm seems a solution, making the skipped line non-used nextLine, but I still need an explanation of this behaviour

                – Eng.Fouad
                Aug 14 '11 at 12:25








              • 2





                FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:11














              179












              179








              179







              The problem is with the input.nextInt() method - it only reads the int value. So when you continue reading with input.nextLine() you receive the "n" Enter key. So to skip this you have to add the input.nextLine(). Hope this should be clear now.



              Try it like that:



              System.out.print("Insert a number: ");
              int number = input.nextInt();
              input.nextLine(); // This line you have to add (It consumes the n character)
              System.out.print("Text1: ");
              String text1 = input.nextLine();
              System.out.print("Text2: ");
              String text2 = input.nextLine();





              share|improve this answer















              The problem is with the input.nextInt() method - it only reads the int value. So when you continue reading with input.nextLine() you receive the "n" Enter key. So to skip this you have to add the input.nextLine(). Hope this should be clear now.



              Try it like that:



              System.out.print("Insert a number: ");
              int number = input.nextInt();
              input.nextLine(); // This line you have to add (It consumes the n character)
              System.out.print("Text1: ");
              String text1 = input.nextLine();
              System.out.print("Text2: ");
              String text2 = input.nextLine();






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Dec 29 '17 at 6:57









              Ebony Maw

              316314




              316314










              answered Aug 14 '11 at 12:24









              PrinePrine

              8,59773355




              8,59773355













              • umm seems a solution, making the skipped line non-used nextLine, but I still need an explanation of this behaviour

                – Eng.Fouad
                Aug 14 '11 at 12:25








              • 2





                FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:11



















              • umm seems a solution, making the skipped line non-used nextLine, but I still need an explanation of this behaviour

                – Eng.Fouad
                Aug 14 '11 at 12:25








              • 2





                FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:11

















              umm seems a solution, making the skipped line non-used nextLine, but I still need an explanation of this behaviour

              – Eng.Fouad
              Aug 14 '11 at 12:25







              umm seems a solution, making the skipped line non-used nextLine, but I still need an explanation of this behaviour

              – Eng.Fouad
              Aug 14 '11 at 12:25






              2




              2





              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:11





              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:11











              69














              It's because when you enter a number then press Enter, input.nextInt() consumes only the number, not the "end of line". When input.nextLine() executes, it consumes the "end of line" still in the buffer from the first input.



              Instead, use input.nextLine() immediately after input.nextInt()






              share|improve this answer
























              • Mmm, that bug was corrected in now a days?

                – Victor
                May 29 '14 at 13:28








              • 7





                @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input.

                – Bohemian
                May 29 '14 at 13:38











              • I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP.

                – Victor
                May 29 '14 at 14:55











              • @victor You can request (and find out how to contribute code to) a feature via the Report a Bug or Request a Feature page.

                – Bohemian
                May 29 '14 at 15:18











              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12
















              69














              It's because when you enter a number then press Enter, input.nextInt() consumes only the number, not the "end of line". When input.nextLine() executes, it consumes the "end of line" still in the buffer from the first input.



              Instead, use input.nextLine() immediately after input.nextInt()






              share|improve this answer
























              • Mmm, that bug was corrected in now a days?

                – Victor
                May 29 '14 at 13:28








              • 7





                @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input.

                – Bohemian
                May 29 '14 at 13:38











              • I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP.

                – Victor
                May 29 '14 at 14:55











              • @victor You can request (and find out how to contribute code to) a feature via the Report a Bug or Request a Feature page.

                – Bohemian
                May 29 '14 at 15:18











              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12














              69












              69








              69







              It's because when you enter a number then press Enter, input.nextInt() consumes only the number, not the "end of line". When input.nextLine() executes, it consumes the "end of line" still in the buffer from the first input.



              Instead, use input.nextLine() immediately after input.nextInt()






              share|improve this answer













              It's because when you enter a number then press Enter, input.nextInt() consumes only the number, not the "end of line". When input.nextLine() executes, it consumes the "end of line" still in the buffer from the first input.



              Instead, use input.nextLine() immediately after input.nextInt()







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Aug 14 '11 at 12:25









              BohemianBohemian

              295k64415553




              295k64415553













              • Mmm, that bug was corrected in now a days?

                – Victor
                May 29 '14 at 13:28








              • 7





                @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input.

                – Bohemian
                May 29 '14 at 13:38











              • I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP.

                – Victor
                May 29 '14 at 14:55











              • @victor You can request (and find out how to contribute code to) a feature via the Report a Bug or Request a Feature page.

                – Bohemian
                May 29 '14 at 15:18











              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12



















              • Mmm, that bug was corrected in now a days?

                – Victor
                May 29 '14 at 13:28








              • 7





                @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input.

                – Bohemian
                May 29 '14 at 13:38











              • I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP.

                – Victor
                May 29 '14 at 14:55











              • @victor You can request (and find out how to contribute code to) a feature via the Report a Bug or Request a Feature page.

                – Bohemian
                May 29 '14 at 15:18











              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12

















              Mmm, that bug was corrected in now a days?

              – Victor
              May 29 '14 at 13:28







              Mmm, that bug was corrected in now a days?

              – Victor
              May 29 '14 at 13:28






              7




              7





              @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input.

              – Bohemian
              May 29 '14 at 13:38





              @Victor it's not bug. it's working as specified. you could argue though that there should be an easy way to tell the api to also consume any whitespace following the target input.

              – Bohemian
              May 29 '14 at 13:38













              I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP.

              – Victor
              May 29 '14 at 14:55





              I see. thanks @Bohemian, that exactly what i am arguing. I think that this should be changed, perhaps you can point me where to suggest this "issue" in the next JCP.

              – Victor
              May 29 '14 at 14:55













              @victor You can request (and find out how to contribute code to) a feature via the Report a Bug or Request a Feature page.

              – Bohemian
              May 29 '14 at 15:18





              @victor You can request (and find out how to contribute code to) a feature via the Report a Bug or Request a Feature page.

              – Bohemian
              May 29 '14 at 15:18













              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:12





              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:12











              37














              There seem to be many questions about this issue with java.util.Scanner. I think a more readable/idiomatic solution would be to call scanner.skip("[rn]+") to drop any newline characters after calling nextInt().



              EDIT: as @PatrickParker noted below, this will cause an infinite loop if user inputs any whitespace after the number. See their answer for a better pattern to use with skip: https://stackoverflow.com/a/42471816/143585






              share|improve this answer


























              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12











              • I know what we do to remove the data in buffer, but this case, please help me with this: stackoverflow.com/questions/33585314/having-issues-with-scanner

                – Khuong
                Nov 7 '15 at 18:03











              • FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: stackoverflow.com/a/42471816/7098259

                – Patrick Parker
                Feb 26 '17 at 17:52











              • @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours.

                – Denis Tulskiy
                Feb 27 '17 at 5:57











              • @PatrickParker Why does is cause infinite loop ?

                – Piyush
                Aug 19 '17 at 8:41
















              37














              There seem to be many questions about this issue with java.util.Scanner. I think a more readable/idiomatic solution would be to call scanner.skip("[rn]+") to drop any newline characters after calling nextInt().



              EDIT: as @PatrickParker noted below, this will cause an infinite loop if user inputs any whitespace after the number. See their answer for a better pattern to use with skip: https://stackoverflow.com/a/42471816/143585






              share|improve this answer


























              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12











              • I know what we do to remove the data in buffer, but this case, please help me with this: stackoverflow.com/questions/33585314/having-issues-with-scanner

                – Khuong
                Nov 7 '15 at 18:03











              • FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: stackoverflow.com/a/42471816/7098259

                – Patrick Parker
                Feb 26 '17 at 17:52











              • @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours.

                – Denis Tulskiy
                Feb 27 '17 at 5:57











              • @PatrickParker Why does is cause infinite loop ?

                – Piyush
                Aug 19 '17 at 8:41














              37












              37








              37







              There seem to be many questions about this issue with java.util.Scanner. I think a more readable/idiomatic solution would be to call scanner.skip("[rn]+") to drop any newline characters after calling nextInt().



              EDIT: as @PatrickParker noted below, this will cause an infinite loop if user inputs any whitespace after the number. See their answer for a better pattern to use with skip: https://stackoverflow.com/a/42471816/143585






              share|improve this answer















              There seem to be many questions about this issue with java.util.Scanner. I think a more readable/idiomatic solution would be to call scanner.skip("[rn]+") to drop any newline characters after calling nextInt().



              EDIT: as @PatrickParker noted below, this will cause an infinite loop if user inputs any whitespace after the number. See their answer for a better pattern to use with skip: https://stackoverflow.com/a/42471816/143585







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited May 23 '17 at 12:10









              Community

              11




              11










              answered Mar 23 '14 at 16:35









              Denis TulskiyDenis Tulskiy

              16.2k54261




              16.2k54261













              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12











              • I know what we do to remove the data in buffer, but this case, please help me with this: stackoverflow.com/questions/33585314/having-issues-with-scanner

                – Khuong
                Nov 7 '15 at 18:03











              • FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: stackoverflow.com/a/42471816/7098259

                – Patrick Parker
                Feb 26 '17 at 17:52











              • @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours.

                – Denis Tulskiy
                Feb 27 '17 at 5:57











              • @PatrickParker Why does is cause infinite loop ?

                – Piyush
                Aug 19 '17 at 8:41



















              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12











              • I know what we do to remove the data in buffer, but this case, please help me with this: stackoverflow.com/questions/33585314/having-issues-with-scanner

                – Khuong
                Nov 7 '15 at 18:03











              • FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: stackoverflow.com/a/42471816/7098259

                – Patrick Parker
                Feb 26 '17 at 17:52











              • @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours.

                – Denis Tulskiy
                Feb 27 '17 at 5:57











              • @PatrickParker Why does is cause infinite loop ?

                – Piyush
                Aug 19 '17 at 8:41

















              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:12





              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:12













              I know what we do to remove the data in buffer, but this case, please help me with this: stackoverflow.com/questions/33585314/having-issues-with-scanner

              – Khuong
              Nov 7 '15 at 18:03





              I know what we do to remove the data in buffer, but this case, please help me with this: stackoverflow.com/questions/33585314/having-issues-with-scanner

              – Khuong
              Nov 7 '15 at 18:03













              FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: stackoverflow.com/a/42471816/7098259

              – Patrick Parker
              Feb 26 '17 at 17:52





              FYI, this will cause an infinite loop is the user types any tabs or spaces after the numeric input. See my answer here for a better skip: stackoverflow.com/a/42471816/7098259

              – Patrick Parker
              Feb 26 '17 at 17:52













              @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours.

              – Denis Tulskiy
              Feb 27 '17 at 5:57





              @PatrickParker: it does indeed cause an infinite loop! Thanks, edited the answer to link to yours.

              – Denis Tulskiy
              Feb 27 '17 at 5:57













              @PatrickParker Why does is cause infinite loop ?

              – Piyush
              Aug 19 '17 at 8:41





              @PatrickParker Why does is cause infinite loop ?

              – Piyush
              Aug 19 '17 at 8:41











              27














              It does that because input.nextInt(); doesn't capture the newline. you could do like the others proposed by adding an input.nextLine(); underneath.

              Alternatively you can do it C# style and parse a nextLine to an integer like so:



              int number = Integer.parseInt(input.nextLine()); 


              Doing this works just as well, and it saves you a line of code.






              share|improve this answer
























              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12
















              27














              It does that because input.nextInt(); doesn't capture the newline. you could do like the others proposed by adding an input.nextLine(); underneath.

              Alternatively you can do it C# style and parse a nextLine to an integer like so:



              int number = Integer.parseInt(input.nextLine()); 


              Doing this works just as well, and it saves you a line of code.






              share|improve this answer
























              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12














              27












              27








              27







              It does that because input.nextInt(); doesn't capture the newline. you could do like the others proposed by adding an input.nextLine(); underneath.

              Alternatively you can do it C# style and parse a nextLine to an integer like so:



              int number = Integer.parseInt(input.nextLine()); 


              Doing this works just as well, and it saves you a line of code.






              share|improve this answer













              It does that because input.nextInt(); doesn't capture the newline. you could do like the others proposed by adding an input.nextLine(); underneath.

              Alternatively you can do it C# style and parse a nextLine to an integer like so:



              int number = Integer.parseInt(input.nextLine()); 


              Doing this works just as well, and it saves you a line of code.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Feb 23 '13 at 22:01









              Electric CoffeeElectric Coffee

              5,63523996




              5,63523996













              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12



















              • FYI: merged from stackoverflow.com/questions/7056749/…

                – Shog9
                Nov 13 '14 at 19:12

















              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:12





              FYI: merged from stackoverflow.com/questions/7056749/…

              – Shog9
              Nov 13 '14 at 19:12











              19














              Things you need to know:





              • text which represents few lines also contains non-printable characters between lines (we call them line separators) like




                • carriage return (CR - in String literals represented as "r")

                • line feed (LF - in String literals represented as "n")




              • when you are reading data from the console, it allows the user to type his response and when he is done he needs to somehow confirm that fact. To do so, the user is required to press "enter"/"return" key on the keyboard.



                What is important is that this key beside ensuring placing user data to standard input (represented by System.in which is read by Scanner) also sends OS dependant line separators (like for Windows rn) after it.



                So when you are asking the user for value like age, and user types 42 and presses enter, standard input will contain "42rn".




              Problem



              Scanner#nextInt (and other Scanner#nextType methods) doesn't allow Scanner to consume these line separators. It will read them from System.in (how else Scanner would know that there are no more digits from the user which represent age value than facing whitespace?) which will remove them from standard input, but it will also cache those line separators internally. What we need to remember, is that all of the Scanner methods are always scanning starting from the cached text.



              Now Scanner#nextLine() simply collects and returns all characters until it finds line separators (or end of stream). But since line separators after reading the number from the console are found immediately in Scanner's cache, it returns empty String, meaning that Scanner was not able to find any character before those line separators (or end of stream).

              BTW nextLine also consumes those line separators.



              Solution



              So when you want to ask for number and then for entire line while avoiding that empty string as result of nextLine, either




              • consume line separator left by nextInt from Scanners cache by


                • calling nextLine,

                • or by calling skip("\R") to let Scanner skip part matched by R which represents line separator (more info about R: https://stackoverflow.com/a/31060125)



              • don't use nextInt (nor next, or any nextTYPE methods) at all. Instead read entire data line-by-line using nextLine and parse numbers from each line (assuming one line contains only one number) to proper type like int via Integer.parseInt.




              BTW: Scanner#nextType methods can skip delimiters (by default all whitespaces like tabs, line separators) including those cached by scanner, until they will find next non-delimiter value (token). Thanks to that for input like "42rnrn321rnrnrnfoobar" code



              int num1 = sc.nextInt();
              int num2 = sc.nextInt();
              String name = sc.next();


              will be able to properly assign num1=42 num2=321 name=foobar.






              share|improve this answer






























                19














                Things you need to know:





                • text which represents few lines also contains non-printable characters between lines (we call them line separators) like




                  • carriage return (CR - in String literals represented as "r")

                  • line feed (LF - in String literals represented as "n")




                • when you are reading data from the console, it allows the user to type his response and when he is done he needs to somehow confirm that fact. To do so, the user is required to press "enter"/"return" key on the keyboard.



                  What is important is that this key beside ensuring placing user data to standard input (represented by System.in which is read by Scanner) also sends OS dependant line separators (like for Windows rn) after it.



                  So when you are asking the user for value like age, and user types 42 and presses enter, standard input will contain "42rn".




                Problem



                Scanner#nextInt (and other Scanner#nextType methods) doesn't allow Scanner to consume these line separators. It will read them from System.in (how else Scanner would know that there are no more digits from the user which represent age value than facing whitespace?) which will remove them from standard input, but it will also cache those line separators internally. What we need to remember, is that all of the Scanner methods are always scanning starting from the cached text.



                Now Scanner#nextLine() simply collects and returns all characters until it finds line separators (or end of stream). But since line separators after reading the number from the console are found immediately in Scanner's cache, it returns empty String, meaning that Scanner was not able to find any character before those line separators (or end of stream).

                BTW nextLine also consumes those line separators.



                Solution



                So when you want to ask for number and then for entire line while avoiding that empty string as result of nextLine, either




                • consume line separator left by nextInt from Scanners cache by


                  • calling nextLine,

                  • or by calling skip("\R") to let Scanner skip part matched by R which represents line separator (more info about R: https://stackoverflow.com/a/31060125)



                • don't use nextInt (nor next, or any nextTYPE methods) at all. Instead read entire data line-by-line using nextLine and parse numbers from each line (assuming one line contains only one number) to proper type like int via Integer.parseInt.




                BTW: Scanner#nextType methods can skip delimiters (by default all whitespaces like tabs, line separators) including those cached by scanner, until they will find next non-delimiter value (token). Thanks to that for input like "42rnrn321rnrnrnfoobar" code



                int num1 = sc.nextInt();
                int num2 = sc.nextInt();
                String name = sc.next();


                will be able to properly assign num1=42 num2=321 name=foobar.






                share|improve this answer




























                  19












                  19








                  19







                  Things you need to know:





                  • text which represents few lines also contains non-printable characters between lines (we call them line separators) like




                    • carriage return (CR - in String literals represented as "r")

                    • line feed (LF - in String literals represented as "n")




                  • when you are reading data from the console, it allows the user to type his response and when he is done he needs to somehow confirm that fact. To do so, the user is required to press "enter"/"return" key on the keyboard.



                    What is important is that this key beside ensuring placing user data to standard input (represented by System.in which is read by Scanner) also sends OS dependant line separators (like for Windows rn) after it.



                    So when you are asking the user for value like age, and user types 42 and presses enter, standard input will contain "42rn".




                  Problem



                  Scanner#nextInt (and other Scanner#nextType methods) doesn't allow Scanner to consume these line separators. It will read them from System.in (how else Scanner would know that there are no more digits from the user which represent age value than facing whitespace?) which will remove them from standard input, but it will also cache those line separators internally. What we need to remember, is that all of the Scanner methods are always scanning starting from the cached text.



                  Now Scanner#nextLine() simply collects and returns all characters until it finds line separators (or end of stream). But since line separators after reading the number from the console are found immediately in Scanner's cache, it returns empty String, meaning that Scanner was not able to find any character before those line separators (or end of stream).

                  BTW nextLine also consumes those line separators.



                  Solution



                  So when you want to ask for number and then for entire line while avoiding that empty string as result of nextLine, either




                  • consume line separator left by nextInt from Scanners cache by


                    • calling nextLine,

                    • or by calling skip("\R") to let Scanner skip part matched by R which represents line separator (more info about R: https://stackoverflow.com/a/31060125)



                  • don't use nextInt (nor next, or any nextTYPE methods) at all. Instead read entire data line-by-line using nextLine and parse numbers from each line (assuming one line contains only one number) to proper type like int via Integer.parseInt.




                  BTW: Scanner#nextType methods can skip delimiters (by default all whitespaces like tabs, line separators) including those cached by scanner, until they will find next non-delimiter value (token). Thanks to that for input like "42rnrn321rnrnrnfoobar" code



                  int num1 = sc.nextInt();
                  int num2 = sc.nextInt();
                  String name = sc.next();


                  will be able to properly assign num1=42 num2=321 name=foobar.






                  share|improve this answer















                  Things you need to know:





                  • text which represents few lines also contains non-printable characters between lines (we call them line separators) like




                    • carriage return (CR - in String literals represented as "r")

                    • line feed (LF - in String literals represented as "n")




                  • when you are reading data from the console, it allows the user to type his response and when he is done he needs to somehow confirm that fact. To do so, the user is required to press "enter"/"return" key on the keyboard.



                    What is important is that this key beside ensuring placing user data to standard input (represented by System.in which is read by Scanner) also sends OS dependant line separators (like for Windows rn) after it.



                    So when you are asking the user for value like age, and user types 42 and presses enter, standard input will contain "42rn".




                  Problem



                  Scanner#nextInt (and other Scanner#nextType methods) doesn't allow Scanner to consume these line separators. It will read them from System.in (how else Scanner would know that there are no more digits from the user which represent age value than facing whitespace?) which will remove them from standard input, but it will also cache those line separators internally. What we need to remember, is that all of the Scanner methods are always scanning starting from the cached text.



                  Now Scanner#nextLine() simply collects and returns all characters until it finds line separators (or end of stream). But since line separators after reading the number from the console are found immediately in Scanner's cache, it returns empty String, meaning that Scanner was not able to find any character before those line separators (or end of stream).

                  BTW nextLine also consumes those line separators.



                  Solution



                  So when you want to ask for number and then for entire line while avoiding that empty string as result of nextLine, either




                  • consume line separator left by nextInt from Scanners cache by


                    • calling nextLine,

                    • or by calling skip("\R") to let Scanner skip part matched by R which represents line separator (more info about R: https://stackoverflow.com/a/31060125)



                  • don't use nextInt (nor next, or any nextTYPE methods) at all. Instead read entire data line-by-line using nextLine and parse numbers from each line (assuming one line contains only one number) to proper type like int via Integer.parseInt.




                  BTW: Scanner#nextType methods can skip delimiters (by default all whitespaces like tabs, line separators) including those cached by scanner, until they will find next non-delimiter value (token). Thanks to that for input like "42rnrn321rnrnrnfoobar" code



                  int num1 = sc.nextInt();
                  int num2 = sc.nextInt();
                  String name = sc.next();


                  will be able to properly assign num1=42 num2=321 name=foobar.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Aug 15 '18 at 16:29

























                  answered Oct 9 '16 at 22:51









                  PshemoPshemo

                  94.1k15130188




                  94.1k15130188























                      7














                      Instead of input.nextLine() use input.next(), that should solve the problem.



                      Modified code:



                      public static Scanner input = new Scanner(System.in);

                      public static void main(String args)
                      {
                      System.out.print("Insert a number: ");
                      int number = input.nextInt();
                      System.out.print("Text1: ");
                      String text1 = input.next();
                      System.out.print("Text2: ");
                      String text2 = input.next();
                      }





                      share|improve this answer


























                      • FYI: merged from stackoverflow.com/questions/7056749/…

                        – Shog9
                        Nov 13 '14 at 19:12
















                      7














                      Instead of input.nextLine() use input.next(), that should solve the problem.



                      Modified code:



                      public static Scanner input = new Scanner(System.in);

                      public static void main(String args)
                      {
                      System.out.print("Insert a number: ");
                      int number = input.nextInt();
                      System.out.print("Text1: ");
                      String text1 = input.next();
                      System.out.print("Text2: ");
                      String text2 = input.next();
                      }





                      share|improve this answer


























                      • FYI: merged from stackoverflow.com/questions/7056749/…

                        – Shog9
                        Nov 13 '14 at 19:12














                      7












                      7








                      7







                      Instead of input.nextLine() use input.next(), that should solve the problem.



                      Modified code:



                      public static Scanner input = new Scanner(System.in);

                      public static void main(String args)
                      {
                      System.out.print("Insert a number: ");
                      int number = input.nextInt();
                      System.out.print("Text1: ");
                      String text1 = input.next();
                      System.out.print("Text2: ");
                      String text2 = input.next();
                      }





                      share|improve this answer















                      Instead of input.nextLine() use input.next(), that should solve the problem.



                      Modified code:



                      public static Scanner input = new Scanner(System.in);

                      public static void main(String args)
                      {
                      System.out.print("Insert a number: ");
                      int number = input.nextInt();
                      System.out.print("Text1: ");
                      String text1 = input.next();
                      System.out.print("Text2: ");
                      String text2 = input.next();
                      }






                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Jul 23 '14 at 10:31









                      arghtype

                      3,04192846




                      3,04192846










                      answered Jul 23 '14 at 10:20









                      CastaldiCastaldi

                      374417




                      374417













                      • FYI: merged from stackoverflow.com/questions/7056749/…

                        – Shog9
                        Nov 13 '14 at 19:12



















                      • FYI: merged from stackoverflow.com/questions/7056749/…

                        – Shog9
                        Nov 13 '14 at 19:12

















                      FYI: merged from stackoverflow.com/questions/7056749/…

                      – Shog9
                      Nov 13 '14 at 19:12





                      FYI: merged from stackoverflow.com/questions/7056749/…

                      – Shog9
                      Nov 13 '14 at 19:12











                      7














                      In order to avoid the issue, use nextLine(); immediately after nextInt(); as it helps in clearing out the buffer. When you press ENTER the nextInt(); does not capture the new line and hence, skips the Scanner code later.



                      Scanner scanner =  new Scanner(System.in);
                      int option = scanner.nextInt();
                      scanner.nextLine(); //clearing the buffer





                      share|improve this answer




























                        7














                        In order to avoid the issue, use nextLine(); immediately after nextInt(); as it helps in clearing out the buffer. When you press ENTER the nextInt(); does not capture the new line and hence, skips the Scanner code later.



                        Scanner scanner =  new Scanner(System.in);
                        int option = scanner.nextInt();
                        scanner.nextLine(); //clearing the buffer





                        share|improve this answer


























                          7












                          7








                          7







                          In order to avoid the issue, use nextLine(); immediately after nextInt(); as it helps in clearing out the buffer. When you press ENTER the nextInt(); does not capture the new line and hence, skips the Scanner code later.



                          Scanner scanner =  new Scanner(System.in);
                          int option = scanner.nextInt();
                          scanner.nextLine(); //clearing the buffer





                          share|improve this answer













                          In order to avoid the issue, use nextLine(); immediately after nextInt(); as it helps in clearing out the buffer. When you press ENTER the nextInt(); does not capture the new line and hence, skips the Scanner code later.



                          Scanner scanner =  new Scanner(System.in);
                          int option = scanner.nextInt();
                          scanner.nextLine(); //clearing the buffer






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 17 '16 at 0:51









                          Urvashi GuptaUrvashi Gupta

                          24739




                          24739























                              7














                              If you want to scan input fast without getting confused into Scanner class nextLine() method , Use Custom Input Scanner for it .



                              Code :



                              class ScanReader {
                              /**
                              * @author Nikunj Khokhar
                              */
                              private byte buf = new byte[4 * 1024];
                              private int index;
                              private BufferedInputStream in;
                              private int total;

                              public ScanReader(InputStream inputStream) {
                              in = new BufferedInputStream(inputStream);
                              }

                              private int scan() throws IOException {
                              if (index >= total) {
                              index = 0;
                              total = in.read(buf);
                              if (total <= 0) return -1;
                              }
                              return buf[index++];
                              }
                              public char scanChar(){
                              int c=scan();
                              while (isWhiteSpace(c))c=scan();
                              return (char)c;
                              }


                              public int scanInt() throws IOException {
                              int integer = 0;
                              int n = scan();
                              while (isWhiteSpace(n)) n = scan();
                              int neg = 1;
                              if (n == '-') {
                              neg = -1;
                              n = scan();
                              }
                              while (!isWhiteSpace(n)) {
                              if (n >= '0' && n <= '9') {
                              integer *= 10;
                              integer += n - '0';
                              n = scan();
                              }
                              }
                              return neg * integer;
                              }

                              public String scanString() throws IOException {
                              int c = scan();
                              while (isWhiteSpace(c)) c = scan();
                              StringBuilder res = new StringBuilder();
                              do {
                              res.appendCodePoint(c);
                              c = scan();
                              } while (!isWhiteSpace(c));
                              return res.toString();
                              }

                              private boolean isWhiteSpace(int n) {
                              if (n == ' ' || n == 'n' || n == 'r' || n == 't' || n == -1) return true;
                              else return false;
                              }

                              public long scanLong() throws IOException {
                              long integer = 0;
                              int n = scan();
                              while (isWhiteSpace(n)) n = scan();
                              int neg = 1;
                              if (n == '-') {
                              neg = -1;
                              n = scan();
                              }
                              while (!isWhiteSpace(n)) {
                              if (n >= '0' && n <= '9') {
                              integer *= 10;
                              integer += n - '0';
                              n = scan();
                              }
                              }
                              return neg * integer;
                              }

                              public void scanLong(long A) throws IOException {
                              for (int i = 0; i < A.length; i++) A[i] = scanLong();
                              }

                              public void scanInt(int A) throws IOException {
                              for (int i = 0; i < A.length; i++) A[i] = scanInt();
                              }

                              public double scanDouble() throws IOException {
                              int c = scan();
                              while (isWhiteSpace(c)) c = scan();
                              int sgn = 1;
                              if (c == '-') {
                              sgn = -1;
                              c = scan();
                              }
                              double res = 0;
                              while (!isWhiteSpace(c) && c != '.') {
                              if (c == 'e' || c == 'E') {
                              return res * Math.pow(10, scanInt());
                              }
                              res *= 10;
                              res += c - '0';
                              c = scan();
                              }
                              if (c == '.') {
                              c = scan();
                              double m = 1;
                              while (!isWhiteSpace(c)) {
                              if (c == 'e' || c == 'E') {
                              return res * Math.pow(10, scanInt());
                              }
                              m /= 10;
                              res += (c - '0') * m;
                              c = scan();
                              }
                              }
                              return res * sgn;
                              }

                              }


                              Advantages :




                              • Scans Input faster than BufferReader

                              • Reduces Time Complexity

                              • Flushes Buffer for every next input


                              Methods :




                              • scanChar() - scan single character

                              • scanInt() - scan Integer value

                              • scanLong() - scan Long value

                              • scanString() - scan String value

                              • scanDouble() - scan Double value

                              • scanInt(int array) - scans complete Array(Integer)

                              • scanLong(long array) - scans complete Array(Long)


                              Usage :




                              1. Copy the Given Code below your java code.

                              2. Initialise Object for Given Class


                              ScanReader sc = new ScanReader(System.in);

                              3. Import necessary Classes :



                              import java.io.BufferedInputStream;
                              import java.io.IOException;
                              import java.io.InputStream;

                              4. Throw IOException from your main method to handle Exception
                              5. Use Provided Methods.
                              6. Enjoy



                              Example :



                              import java.io.BufferedInputStream;
                              import java.io.IOException;
                              import java.io.InputStream;
                              class Main{
                              public static void main(String... as) throws IOException{
                              ScanReader sc = new ScanReader(System.in);
                              int a=sc.scanInt();
                              System.out.println(a);
                              }
                              }
                              class ScanReader....





                              share|improve this answer




























                                7














                                If you want to scan input fast without getting confused into Scanner class nextLine() method , Use Custom Input Scanner for it .



                                Code :



                                class ScanReader {
                                /**
                                * @author Nikunj Khokhar
                                */
                                private byte buf = new byte[4 * 1024];
                                private int index;
                                private BufferedInputStream in;
                                private int total;

                                public ScanReader(InputStream inputStream) {
                                in = new BufferedInputStream(inputStream);
                                }

                                private int scan() throws IOException {
                                if (index >= total) {
                                index = 0;
                                total = in.read(buf);
                                if (total <= 0) return -1;
                                }
                                return buf[index++];
                                }
                                public char scanChar(){
                                int c=scan();
                                while (isWhiteSpace(c))c=scan();
                                return (char)c;
                                }


                                public int scanInt() throws IOException {
                                int integer = 0;
                                int n = scan();
                                while (isWhiteSpace(n)) n = scan();
                                int neg = 1;
                                if (n == '-') {
                                neg = -1;
                                n = scan();
                                }
                                while (!isWhiteSpace(n)) {
                                if (n >= '0' && n <= '9') {
                                integer *= 10;
                                integer += n - '0';
                                n = scan();
                                }
                                }
                                return neg * integer;
                                }

                                public String scanString() throws IOException {
                                int c = scan();
                                while (isWhiteSpace(c)) c = scan();
                                StringBuilder res = new StringBuilder();
                                do {
                                res.appendCodePoint(c);
                                c = scan();
                                } while (!isWhiteSpace(c));
                                return res.toString();
                                }

                                private boolean isWhiteSpace(int n) {
                                if (n == ' ' || n == 'n' || n == 'r' || n == 't' || n == -1) return true;
                                else return false;
                                }

                                public long scanLong() throws IOException {
                                long integer = 0;
                                int n = scan();
                                while (isWhiteSpace(n)) n = scan();
                                int neg = 1;
                                if (n == '-') {
                                neg = -1;
                                n = scan();
                                }
                                while (!isWhiteSpace(n)) {
                                if (n >= '0' && n <= '9') {
                                integer *= 10;
                                integer += n - '0';
                                n = scan();
                                }
                                }
                                return neg * integer;
                                }

                                public void scanLong(long A) throws IOException {
                                for (int i = 0; i < A.length; i++) A[i] = scanLong();
                                }

                                public void scanInt(int A) throws IOException {
                                for (int i = 0; i < A.length; i++) A[i] = scanInt();
                                }

                                public double scanDouble() throws IOException {
                                int c = scan();
                                while (isWhiteSpace(c)) c = scan();
                                int sgn = 1;
                                if (c == '-') {
                                sgn = -1;
                                c = scan();
                                }
                                double res = 0;
                                while (!isWhiteSpace(c) && c != '.') {
                                if (c == 'e' || c == 'E') {
                                return res * Math.pow(10, scanInt());
                                }
                                res *= 10;
                                res += c - '0';
                                c = scan();
                                }
                                if (c == '.') {
                                c = scan();
                                double m = 1;
                                while (!isWhiteSpace(c)) {
                                if (c == 'e' || c == 'E') {
                                return res * Math.pow(10, scanInt());
                                }
                                m /= 10;
                                res += (c - '0') * m;
                                c = scan();
                                }
                                }
                                return res * sgn;
                                }

                                }


                                Advantages :




                                • Scans Input faster than BufferReader

                                • Reduces Time Complexity

                                • Flushes Buffer for every next input


                                Methods :




                                • scanChar() - scan single character

                                • scanInt() - scan Integer value

                                • scanLong() - scan Long value

                                • scanString() - scan String value

                                • scanDouble() - scan Double value

                                • scanInt(int array) - scans complete Array(Integer)

                                • scanLong(long array) - scans complete Array(Long)


                                Usage :




                                1. Copy the Given Code below your java code.

                                2. Initialise Object for Given Class


                                ScanReader sc = new ScanReader(System.in);

                                3. Import necessary Classes :



                                import java.io.BufferedInputStream;
                                import java.io.IOException;
                                import java.io.InputStream;

                                4. Throw IOException from your main method to handle Exception
                                5. Use Provided Methods.
                                6. Enjoy



                                Example :



                                import java.io.BufferedInputStream;
                                import java.io.IOException;
                                import java.io.InputStream;
                                class Main{
                                public static void main(String... as) throws IOException{
                                ScanReader sc = new ScanReader(System.in);
                                int a=sc.scanInt();
                                System.out.println(a);
                                }
                                }
                                class ScanReader....





                                share|improve this answer


























                                  7












                                  7








                                  7







                                  If you want to scan input fast without getting confused into Scanner class nextLine() method , Use Custom Input Scanner for it .



                                  Code :



                                  class ScanReader {
                                  /**
                                  * @author Nikunj Khokhar
                                  */
                                  private byte buf = new byte[4 * 1024];
                                  private int index;
                                  private BufferedInputStream in;
                                  private int total;

                                  public ScanReader(InputStream inputStream) {
                                  in = new BufferedInputStream(inputStream);
                                  }

                                  private int scan() throws IOException {
                                  if (index >= total) {
                                  index = 0;
                                  total = in.read(buf);
                                  if (total <= 0) return -1;
                                  }
                                  return buf[index++];
                                  }
                                  public char scanChar(){
                                  int c=scan();
                                  while (isWhiteSpace(c))c=scan();
                                  return (char)c;
                                  }


                                  public int scanInt() throws IOException {
                                  int integer = 0;
                                  int n = scan();
                                  while (isWhiteSpace(n)) n = scan();
                                  int neg = 1;
                                  if (n == '-') {
                                  neg = -1;
                                  n = scan();
                                  }
                                  while (!isWhiteSpace(n)) {
                                  if (n >= '0' && n <= '9') {
                                  integer *= 10;
                                  integer += n - '0';
                                  n = scan();
                                  }
                                  }
                                  return neg * integer;
                                  }

                                  public String scanString() throws IOException {
                                  int c = scan();
                                  while (isWhiteSpace(c)) c = scan();
                                  StringBuilder res = new StringBuilder();
                                  do {
                                  res.appendCodePoint(c);
                                  c = scan();
                                  } while (!isWhiteSpace(c));
                                  return res.toString();
                                  }

                                  private boolean isWhiteSpace(int n) {
                                  if (n == ' ' || n == 'n' || n == 'r' || n == 't' || n == -1) return true;
                                  else return false;
                                  }

                                  public long scanLong() throws IOException {
                                  long integer = 0;
                                  int n = scan();
                                  while (isWhiteSpace(n)) n = scan();
                                  int neg = 1;
                                  if (n == '-') {
                                  neg = -1;
                                  n = scan();
                                  }
                                  while (!isWhiteSpace(n)) {
                                  if (n >= '0' && n <= '9') {
                                  integer *= 10;
                                  integer += n - '0';
                                  n = scan();
                                  }
                                  }
                                  return neg * integer;
                                  }

                                  public void scanLong(long A) throws IOException {
                                  for (int i = 0; i < A.length; i++) A[i] = scanLong();
                                  }

                                  public void scanInt(int A) throws IOException {
                                  for (int i = 0; i < A.length; i++) A[i] = scanInt();
                                  }

                                  public double scanDouble() throws IOException {
                                  int c = scan();
                                  while (isWhiteSpace(c)) c = scan();
                                  int sgn = 1;
                                  if (c == '-') {
                                  sgn = -1;
                                  c = scan();
                                  }
                                  double res = 0;
                                  while (!isWhiteSpace(c) && c != '.') {
                                  if (c == 'e' || c == 'E') {
                                  return res * Math.pow(10, scanInt());
                                  }
                                  res *= 10;
                                  res += c - '0';
                                  c = scan();
                                  }
                                  if (c == '.') {
                                  c = scan();
                                  double m = 1;
                                  while (!isWhiteSpace(c)) {
                                  if (c == 'e' || c == 'E') {
                                  return res * Math.pow(10, scanInt());
                                  }
                                  m /= 10;
                                  res += (c - '0') * m;
                                  c = scan();
                                  }
                                  }
                                  return res * sgn;
                                  }

                                  }


                                  Advantages :




                                  • Scans Input faster than BufferReader

                                  • Reduces Time Complexity

                                  • Flushes Buffer for every next input


                                  Methods :




                                  • scanChar() - scan single character

                                  • scanInt() - scan Integer value

                                  • scanLong() - scan Long value

                                  • scanString() - scan String value

                                  • scanDouble() - scan Double value

                                  • scanInt(int array) - scans complete Array(Integer)

                                  • scanLong(long array) - scans complete Array(Long)


                                  Usage :




                                  1. Copy the Given Code below your java code.

                                  2. Initialise Object for Given Class


                                  ScanReader sc = new ScanReader(System.in);

                                  3. Import necessary Classes :



                                  import java.io.BufferedInputStream;
                                  import java.io.IOException;
                                  import java.io.InputStream;

                                  4. Throw IOException from your main method to handle Exception
                                  5. Use Provided Methods.
                                  6. Enjoy



                                  Example :



                                  import java.io.BufferedInputStream;
                                  import java.io.IOException;
                                  import java.io.InputStream;
                                  class Main{
                                  public static void main(String... as) throws IOException{
                                  ScanReader sc = new ScanReader(System.in);
                                  int a=sc.scanInt();
                                  System.out.println(a);
                                  }
                                  }
                                  class ScanReader....





                                  share|improve this answer













                                  If you want to scan input fast without getting confused into Scanner class nextLine() method , Use Custom Input Scanner for it .



                                  Code :



                                  class ScanReader {
                                  /**
                                  * @author Nikunj Khokhar
                                  */
                                  private byte buf = new byte[4 * 1024];
                                  private int index;
                                  private BufferedInputStream in;
                                  private int total;

                                  public ScanReader(InputStream inputStream) {
                                  in = new BufferedInputStream(inputStream);
                                  }

                                  private int scan() throws IOException {
                                  if (index >= total) {
                                  index = 0;
                                  total = in.read(buf);
                                  if (total <= 0) return -1;
                                  }
                                  return buf[index++];
                                  }
                                  public char scanChar(){
                                  int c=scan();
                                  while (isWhiteSpace(c))c=scan();
                                  return (char)c;
                                  }


                                  public int scanInt() throws IOException {
                                  int integer = 0;
                                  int n = scan();
                                  while (isWhiteSpace(n)) n = scan();
                                  int neg = 1;
                                  if (n == '-') {
                                  neg = -1;
                                  n = scan();
                                  }
                                  while (!isWhiteSpace(n)) {
                                  if (n >= '0' && n <= '9') {
                                  integer *= 10;
                                  integer += n - '0';
                                  n = scan();
                                  }
                                  }
                                  return neg * integer;
                                  }

                                  public String scanString() throws IOException {
                                  int c = scan();
                                  while (isWhiteSpace(c)) c = scan();
                                  StringBuilder res = new StringBuilder();
                                  do {
                                  res.appendCodePoint(c);
                                  c = scan();
                                  } while (!isWhiteSpace(c));
                                  return res.toString();
                                  }

                                  private boolean isWhiteSpace(int n) {
                                  if (n == ' ' || n == 'n' || n == 'r' || n == 't' || n == -1) return true;
                                  else return false;
                                  }

                                  public long scanLong() throws IOException {
                                  long integer = 0;
                                  int n = scan();
                                  while (isWhiteSpace(n)) n = scan();
                                  int neg = 1;
                                  if (n == '-') {
                                  neg = -1;
                                  n = scan();
                                  }
                                  while (!isWhiteSpace(n)) {
                                  if (n >= '0' && n <= '9') {
                                  integer *= 10;
                                  integer += n - '0';
                                  n = scan();
                                  }
                                  }
                                  return neg * integer;
                                  }

                                  public void scanLong(long A) throws IOException {
                                  for (int i = 0; i < A.length; i++) A[i] = scanLong();
                                  }

                                  public void scanInt(int A) throws IOException {
                                  for (int i = 0; i < A.length; i++) A[i] = scanInt();
                                  }

                                  public double scanDouble() throws IOException {
                                  int c = scan();
                                  while (isWhiteSpace(c)) c = scan();
                                  int sgn = 1;
                                  if (c == '-') {
                                  sgn = -1;
                                  c = scan();
                                  }
                                  double res = 0;
                                  while (!isWhiteSpace(c) && c != '.') {
                                  if (c == 'e' || c == 'E') {
                                  return res * Math.pow(10, scanInt());
                                  }
                                  res *= 10;
                                  res += c - '0';
                                  c = scan();
                                  }
                                  if (c == '.') {
                                  c = scan();
                                  double m = 1;
                                  while (!isWhiteSpace(c)) {
                                  if (c == 'e' || c == 'E') {
                                  return res * Math.pow(10, scanInt());
                                  }
                                  m /= 10;
                                  res += (c - '0') * m;
                                  c = scan();
                                  }
                                  }
                                  return res * sgn;
                                  }

                                  }


                                  Advantages :




                                  • Scans Input faster than BufferReader

                                  • Reduces Time Complexity

                                  • Flushes Buffer for every next input


                                  Methods :




                                  • scanChar() - scan single character

                                  • scanInt() - scan Integer value

                                  • scanLong() - scan Long value

                                  • scanString() - scan String value

                                  • scanDouble() - scan Double value

                                  • scanInt(int array) - scans complete Array(Integer)

                                  • scanLong(long array) - scans complete Array(Long)


                                  Usage :




                                  1. Copy the Given Code below your java code.

                                  2. Initialise Object for Given Class


                                  ScanReader sc = new ScanReader(System.in);

                                  3. Import necessary Classes :



                                  import java.io.BufferedInputStream;
                                  import java.io.IOException;
                                  import java.io.InputStream;

                                  4. Throw IOException from your main method to handle Exception
                                  5. Use Provided Methods.
                                  6. Enjoy



                                  Example :



                                  import java.io.BufferedInputStream;
                                  import java.io.IOException;
                                  import java.io.InputStream;
                                  class Main{
                                  public static void main(String... as) throws IOException{
                                  ScanReader sc = new ScanReader(System.in);
                                  int a=sc.scanInt();
                                  System.out.println(a);
                                  }
                                  }
                                  class ScanReader....






                                  share|improve this answer












                                  share|improve this answer



                                  share|improve this answer










                                  answered Jun 16 '17 at 8:12









                                  NIKUNJ KHOKHARNIKUNJ KHOKHAR

                                  311313




                                  311313























                                      5














                                      sc.nextLine() is better as compared to parsing the input.
                                      Because performance wise it will be good.






                                      share|improve this answer






























                                        5














                                        sc.nextLine() is better as compared to parsing the input.
                                        Because performance wise it will be good.






                                        share|improve this answer




























                                          5












                                          5








                                          5







                                          sc.nextLine() is better as compared to parsing the input.
                                          Because performance wise it will be good.






                                          share|improve this answer















                                          sc.nextLine() is better as compared to parsing the input.
                                          Because performance wise it will be good.







                                          share|improve this answer














                                          share|improve this answer



                                          share|improve this answer








                                          edited Sep 14 '17 at 10:45









                                          Aurasphere

                                          2,519102850




                                          2,519102850










                                          answered Sep 14 '17 at 10:16









                                          shankar Dayal upadhyayshankar Dayal upadhyay

                                          15028




                                          15028























                                              4














                                              If you want to read both strings and ints, a solution is to use two Scanners:



                                              Scanner stringScanner = new Scanner(System.in);
                                              Scanner intScanner = new Scanner(System.in);

                                              intScanner.nextInt();
                                              String s = stringScanner.nextLine(); // unaffected by previous nextInt()
                                              System.out.println(s);

                                              intScanner.close();
                                              stringScanner.close();





                                              share|improve this answer




























                                                4














                                                If you want to read both strings and ints, a solution is to use two Scanners:



                                                Scanner stringScanner = new Scanner(System.in);
                                                Scanner intScanner = new Scanner(System.in);

                                                intScanner.nextInt();
                                                String s = stringScanner.nextLine(); // unaffected by previous nextInt()
                                                System.out.println(s);

                                                intScanner.close();
                                                stringScanner.close();





                                                share|improve this answer


























                                                  4












                                                  4








                                                  4







                                                  If you want to read both strings and ints, a solution is to use two Scanners:



                                                  Scanner stringScanner = new Scanner(System.in);
                                                  Scanner intScanner = new Scanner(System.in);

                                                  intScanner.nextInt();
                                                  String s = stringScanner.nextLine(); // unaffected by previous nextInt()
                                                  System.out.println(s);

                                                  intScanner.close();
                                                  stringScanner.close();





                                                  share|improve this answer













                                                  If you want to read both strings and ints, a solution is to use two Scanners:



                                                  Scanner stringScanner = new Scanner(System.in);
                                                  Scanner intScanner = new Scanner(System.in);

                                                  intScanner.nextInt();
                                                  String s = stringScanner.nextLine(); // unaffected by previous nextInt()
                                                  System.out.println(s);

                                                  intScanner.close();
                                                  stringScanner.close();






                                                  share|improve this answer












                                                  share|improve this answer



                                                  share|improve this answer










                                                  answered Jun 20 '17 at 18:52









                                                  André ValentiAndré Valenti

                                                  34029




                                                  34029























                                                      1














                                                      I guess I'm pretty late to the party..



                                                      As previously stated, calling input.nextLine() after getting your int value will solve your problem. The reason why your code didn't work was because there was nothing else to store from your input (where you inputted the int) into string1. I'll just shed a little more light to the entire topic.



                                                      Consider nextLine() as the odd one out among the nextFoo() methods in the Scanner class. Let's take a quick example.. Let's say we have two lines of code like the ones below:



                                                      int firstNumber = input.nextInt();
                                                      int secondNumber = input.nextInt();


                                                      If we input the value below (as a single line of input)




                                                      54 234




                                                      The value of our firstNumber and secondNumber variable become 54 and 234 respectively. The reason why this works this way is because a new line feed (i.e n) IS NOT automatically generated when the nextInt() method takes in the values. It simply takes the "next int" and moves on. This is the same for the rest of the nextFoo() methods except nextLine().



                                                      nextLine() generates a new line feed immediately after taking a value; this is what @RohitJain means by saying the new line feed is "consumed".



                                                      Lastly, the next() method simply takes the nearest String without generating a new line; this makes this the preferential method for taking separate Strings within the same single line.



                                                      I hope this helps.. Merry coding!






                                                      share|improve this answer


























                                                      • what is a "new line feed"?

                                                        – Abcd
                                                        Jan 13 at 16:22











                                                      • @Abcd A new line feed basically means 'starting from a new line'.

                                                        – Taslim
                                                        Jan 13 at 19:35
















                                                      1














                                                      I guess I'm pretty late to the party..



                                                      As previously stated, calling input.nextLine() after getting your int value will solve your problem. The reason why your code didn't work was because there was nothing else to store from your input (where you inputted the int) into string1. I'll just shed a little more light to the entire topic.



                                                      Consider nextLine() as the odd one out among the nextFoo() methods in the Scanner class. Let's take a quick example.. Let's say we have two lines of code like the ones below:



                                                      int firstNumber = input.nextInt();
                                                      int secondNumber = input.nextInt();


                                                      If we input the value below (as a single line of input)




                                                      54 234




                                                      The value of our firstNumber and secondNumber variable become 54 and 234 respectively. The reason why this works this way is because a new line feed (i.e n) IS NOT automatically generated when the nextInt() method takes in the values. It simply takes the "next int" and moves on. This is the same for the rest of the nextFoo() methods except nextLine().



                                                      nextLine() generates a new line feed immediately after taking a value; this is what @RohitJain means by saying the new line feed is "consumed".



                                                      Lastly, the next() method simply takes the nearest String without generating a new line; this makes this the preferential method for taking separate Strings within the same single line.



                                                      I hope this helps.. Merry coding!






                                                      share|improve this answer


























                                                      • what is a "new line feed"?

                                                        – Abcd
                                                        Jan 13 at 16:22











                                                      • @Abcd A new line feed basically means 'starting from a new line'.

                                                        – Taslim
                                                        Jan 13 at 19:35














                                                      1












                                                      1








                                                      1







                                                      I guess I'm pretty late to the party..



                                                      As previously stated, calling input.nextLine() after getting your int value will solve your problem. The reason why your code didn't work was because there was nothing else to store from your input (where you inputted the int) into string1. I'll just shed a little more light to the entire topic.



                                                      Consider nextLine() as the odd one out among the nextFoo() methods in the Scanner class. Let's take a quick example.. Let's say we have two lines of code like the ones below:



                                                      int firstNumber = input.nextInt();
                                                      int secondNumber = input.nextInt();


                                                      If we input the value below (as a single line of input)




                                                      54 234




                                                      The value of our firstNumber and secondNumber variable become 54 and 234 respectively. The reason why this works this way is because a new line feed (i.e n) IS NOT automatically generated when the nextInt() method takes in the values. It simply takes the "next int" and moves on. This is the same for the rest of the nextFoo() methods except nextLine().



                                                      nextLine() generates a new line feed immediately after taking a value; this is what @RohitJain means by saying the new line feed is "consumed".



                                                      Lastly, the next() method simply takes the nearest String without generating a new line; this makes this the preferential method for taking separate Strings within the same single line.



                                                      I hope this helps.. Merry coding!






                                                      share|improve this answer















                                                      I guess I'm pretty late to the party..



                                                      As previously stated, calling input.nextLine() after getting your int value will solve your problem. The reason why your code didn't work was because there was nothing else to store from your input (where you inputted the int) into string1. I'll just shed a little more light to the entire topic.



                                                      Consider nextLine() as the odd one out among the nextFoo() methods in the Scanner class. Let's take a quick example.. Let's say we have two lines of code like the ones below:



                                                      int firstNumber = input.nextInt();
                                                      int secondNumber = input.nextInt();


                                                      If we input the value below (as a single line of input)




                                                      54 234




                                                      The value of our firstNumber and secondNumber variable become 54 and 234 respectively. The reason why this works this way is because a new line feed (i.e n) IS NOT automatically generated when the nextInt() method takes in the values. It simply takes the "next int" and moves on. This is the same for the rest of the nextFoo() methods except nextLine().



                                                      nextLine() generates a new line feed immediately after taking a value; this is what @RohitJain means by saying the new line feed is "consumed".



                                                      Lastly, the next() method simply takes the nearest String without generating a new line; this makes this the preferential method for taking separate Strings within the same single line.



                                                      I hope this helps.. Merry coding!







                                                      share|improve this answer














                                                      share|improve this answer



                                                      share|improve this answer








                                                      edited Jan 7 '18 at 10:40

























                                                      answered Jan 7 '18 at 10:33









                                                      TaslimTaslim

                                                      1,22741525




                                                      1,22741525













                                                      • what is a "new line feed"?

                                                        – Abcd
                                                        Jan 13 at 16:22











                                                      • @Abcd A new line feed basically means 'starting from a new line'.

                                                        – Taslim
                                                        Jan 13 at 19:35



















                                                      • what is a "new line feed"?

                                                        – Abcd
                                                        Jan 13 at 16:22











                                                      • @Abcd A new line feed basically means 'starting from a new line'.

                                                        – Taslim
                                                        Jan 13 at 19:35

















                                                      what is a "new line feed"?

                                                      – Abcd
                                                      Jan 13 at 16:22





                                                      what is a "new line feed"?

                                                      – Abcd
                                                      Jan 13 at 16:22













                                                      @Abcd A new line feed basically means 'starting from a new line'.

                                                      – Taslim
                                                      Jan 13 at 19:35





                                                      @Abcd A new line feed basically means 'starting from a new line'.

                                                      – Taslim
                                                      Jan 13 at 19:35











                                                      0














                                                      public static void main(String args) {
                                                      Scanner scan = new Scanner(System.in);
                                                      int i = scan.nextInt();
                                                      scan.nextLine();
                                                      double d = scan.nextDouble();
                                                      scan.nextLine();
                                                      String s = scan.nextLine();

                                                      System.out.println("String: " + s);
                                                      System.out.println("Double: " + d);
                                                      System.out.println("Int: " + i);
                                                      }





                                                      share|improve this answer
























                                                      • If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

                                                        – Neeraj Gahlawat
                                                        Jul 30 '17 at 3:50
















                                                      0














                                                      public static void main(String args) {
                                                      Scanner scan = new Scanner(System.in);
                                                      int i = scan.nextInt();
                                                      scan.nextLine();
                                                      double d = scan.nextDouble();
                                                      scan.nextLine();
                                                      String s = scan.nextLine();

                                                      System.out.println("String: " + s);
                                                      System.out.println("Double: " + d);
                                                      System.out.println("Int: " + i);
                                                      }





                                                      share|improve this answer
























                                                      • If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

                                                        – Neeraj Gahlawat
                                                        Jul 30 '17 at 3:50














                                                      0












                                                      0








                                                      0







                                                      public static void main(String args) {
                                                      Scanner scan = new Scanner(System.in);
                                                      int i = scan.nextInt();
                                                      scan.nextLine();
                                                      double d = scan.nextDouble();
                                                      scan.nextLine();
                                                      String s = scan.nextLine();

                                                      System.out.println("String: " + s);
                                                      System.out.println("Double: " + d);
                                                      System.out.println("Int: " + i);
                                                      }





                                                      share|improve this answer













                                                      public static void main(String args) {
                                                      Scanner scan = new Scanner(System.in);
                                                      int i = scan.nextInt();
                                                      scan.nextLine();
                                                      double d = scan.nextDouble();
                                                      scan.nextLine();
                                                      String s = scan.nextLine();

                                                      System.out.println("String: " + s);
                                                      System.out.println("Double: " + d);
                                                      System.out.println("Int: " + i);
                                                      }






                                                      share|improve this answer












                                                      share|improve this answer



                                                      share|improve this answer










                                                      answered Jul 30 '17 at 3:48









                                                      Neeraj GahlawatNeeraj Gahlawat

                                                      45342




                                                      45342













                                                      • If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

                                                        – Neeraj Gahlawat
                                                        Jul 30 '17 at 3:50



















                                                      • If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

                                                        – Neeraj Gahlawat
                                                        Jul 30 '17 at 3:50

















                                                      If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

                                                      – Neeraj Gahlawat
                                                      Jul 30 '17 at 3:50





                                                      If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

                                                      – Neeraj Gahlawat
                                                      Jul 30 '17 at 3:50











                                                      -1














                                                      Use 2 scanner objects instead of one



                                                      Scanner input = new Scanner(System.in);
                                                      System.out.println("Enter numerical value");
                                                      int option;
                                                      Scanner input2 = new Scanner(System.in);
                                                      option = input2.nextInt();





                                                      share|improve this answer




























                                                        -1














                                                        Use 2 scanner objects instead of one



                                                        Scanner input = new Scanner(System.in);
                                                        System.out.println("Enter numerical value");
                                                        int option;
                                                        Scanner input2 = new Scanner(System.in);
                                                        option = input2.nextInt();





                                                        share|improve this answer


























                                                          -1












                                                          -1








                                                          -1







                                                          Use 2 scanner objects instead of one



                                                          Scanner input = new Scanner(System.in);
                                                          System.out.println("Enter numerical value");
                                                          int option;
                                                          Scanner input2 = new Scanner(System.in);
                                                          option = input2.nextInt();





                                                          share|improve this answer













                                                          Use 2 scanner objects instead of one



                                                          Scanner input = new Scanner(System.in);
                                                          System.out.println("Enter numerical value");
                                                          int option;
                                                          Scanner input2 = new Scanner(System.in);
                                                          option = input2.nextInt();






                                                          share|improve this answer












                                                          share|improve this answer



                                                          share|improve this answer










                                                          answered 8 hours ago









                                                          Harsh ShahHarsh Shah

                                                          192




                                                          192























                                                              -2














                                                              Why not use a new Scanner for every reading? Like below. With this approach you will not confront your problem.



                                                              int i = new Scanner(System.in).nextInt();





                                                              share|improve this answer



















                                                              • 1





                                                                But then you have to close the Scanner to prevent memory leak. Wasting time?

                                                                – TheCoffeeCup
                                                                Oct 8 '15 at 1:22











                                                              • Doesn't the GC take care of that if the Scanner is wrapped in a method? Like: String getInput() {return new Scanner(System.in).nextLine()};

                                                                – Tobias Johansson
                                                                Jun 1 '16 at 22:14











                                                              • This is absolutely incorrect. nextInt() won't consume the newline, regardless of whether it's in a "new" Scanner or an already used one.

                                                                – Dawood ibn Kareem
                                                                Dec 29 '16 at 20:55


















                                                              -2














                                                              Why not use a new Scanner for every reading? Like below. With this approach you will not confront your problem.



                                                              int i = new Scanner(System.in).nextInt();





                                                              share|improve this answer



















                                                              • 1





                                                                But then you have to close the Scanner to prevent memory leak. Wasting time?

                                                                – TheCoffeeCup
                                                                Oct 8 '15 at 1:22











                                                              • Doesn't the GC take care of that if the Scanner is wrapped in a method? Like: String getInput() {return new Scanner(System.in).nextLine()};

                                                                – Tobias Johansson
                                                                Jun 1 '16 at 22:14











                                                              • This is absolutely incorrect. nextInt() won't consume the newline, regardless of whether it's in a "new" Scanner or an already used one.

                                                                – Dawood ibn Kareem
                                                                Dec 29 '16 at 20:55
















                                                              -2












                                                              -2








                                                              -2







                                                              Why not use a new Scanner for every reading? Like below. With this approach you will not confront your problem.



                                                              int i = new Scanner(System.in).nextInt();





                                                              share|improve this answer













                                                              Why not use a new Scanner for every reading? Like below. With this approach you will not confront your problem.



                                                              int i = new Scanner(System.in).nextInt();






                                                              share|improve this answer












                                                              share|improve this answer



                                                              share|improve this answer










                                                              answered Mar 13 '15 at 11:06









                                                              Tobias JohanssonTobias Johansson

                                                              170111




                                                              170111








                                                              • 1





                                                                But then you have to close the Scanner to prevent memory leak. Wasting time?

                                                                – TheCoffeeCup
                                                                Oct 8 '15 at 1:22











                                                              • Doesn't the GC take care of that if the Scanner is wrapped in a method? Like: String getInput() {return new Scanner(System.in).nextLine()};

                                                                – Tobias Johansson
                                                                Jun 1 '16 at 22:14











                                                              • This is absolutely incorrect. nextInt() won't consume the newline, regardless of whether it's in a "new" Scanner or an already used one.

                                                                – Dawood ibn Kareem
                                                                Dec 29 '16 at 20:55
















                                                              • 1





                                                                But then you have to close the Scanner to prevent memory leak. Wasting time?

                                                                – TheCoffeeCup
                                                                Oct 8 '15 at 1:22











                                                              • Doesn't the GC take care of that if the Scanner is wrapped in a method? Like: String getInput() {return new Scanner(System.in).nextLine()};

                                                                – Tobias Johansson
                                                                Jun 1 '16 at 22:14











                                                              • This is absolutely incorrect. nextInt() won't consume the newline, regardless of whether it's in a "new" Scanner or an already used one.

                                                                – Dawood ibn Kareem
                                                                Dec 29 '16 at 20:55










                                                              1




                                                              1





                                                              But then you have to close the Scanner to prevent memory leak. Wasting time?

                                                              – TheCoffeeCup
                                                              Oct 8 '15 at 1:22





                                                              But then you have to close the Scanner to prevent memory leak. Wasting time?

                                                              – TheCoffeeCup
                                                              Oct 8 '15 at 1:22













                                                              Doesn't the GC take care of that if the Scanner is wrapped in a method? Like: String getInput() {return new Scanner(System.in).nextLine()};

                                                              – Tobias Johansson
                                                              Jun 1 '16 at 22:14





                                                              Doesn't the GC take care of that if the Scanner is wrapped in a method? Like: String getInput() {return new Scanner(System.in).nextLine()};

                                                              – Tobias Johansson
                                                              Jun 1 '16 at 22:14













                                                              This is absolutely incorrect. nextInt() won't consume the newline, regardless of whether it's in a "new" Scanner or an already used one.

                                                              – Dawood ibn Kareem
                                                              Dec 29 '16 at 20:55







                                                              This is absolutely incorrect. nextInt() won't consume the newline, regardless of whether it's in a "new" Scanner or an already used one.

                                                              – Dawood ibn Kareem
                                                              Dec 29 '16 at 20:55







                                                              protected by Aniket Thakur Apr 19 '15 at 9:05



                                                              Thank you for your interest in this question.
                                                              Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).



                                                              Would you like to answer one of these unanswered questions instead?



                                                              Popular posts from this blog

                                                              'app-layout' is not a known element: how to share Component with different Modules

                                                              android studio warns about leanback feature tag usage required on manifest while using Unity exported app?

                                                              WPF add header to Image with URL pettitions [duplicate]