Saturday 28 October 2017

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

itemprop="text">

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.


class="post-text" itemprop="text">
class="normal">Answer



That's
because the href="http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28%29"
rel="noreferrer">Scanner.nextInt method does not
read the newline character in your input created by hitting
"Enter," and so the call to href="http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine%28%29"
rel="noreferrer">Scanner.nextLine returns after
reading that newline.



You
will encounter the similar behaviour when you use
Scanner.nextLine after href="http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#next%28%29"
rel="noreferrer">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 href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String)"
    rel="noreferrer">Integer.parseInt(String)
    method.



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

    e.printStackTrace();
    }
    String str1 =
    input.nextLine();



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...