Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
281 views
in Technique[技术] by (71.8m points)

java, programm not stopping for scan.nextLine()

When I run the following code it stops to let me enter servername and them port number, after that it is supposed to stop and let me enter username but it never pauses for scan.nextline() and flies straight to enter reciever name??

public static void main(String[] args) throws IOException {
    try {
        System.out.println("


TCP Chat Client

Enter server name:");
        Scanner scan = new Scanner(System.in);

        //get server info from user
        serverName = scan.nextLine();

        System.out.println("
Enter port number:");
        serverPort = scan.nextInt();


        System.out.println("Enter your username:
");
        userName = scan.nextLine();

        //make connection to server
        cSocket = new Socket(serverName, serverPort);
        out = new PrintWriter(cSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));

        //send username to server
        out.println(userName);
        String rcvrname="wefwef";
        String message=null;
        //start messaging
        while(!(rcvrname.equals("exit"))){
            System.out.println("Enter reciever name");
            out.println(scan.nextLine());
            System.out.println("Enter message");
            out.println(scan.nextLine());

        }
        out.close();
        in.close();
        cSocket.close();

    }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Instead of scan.nextInt(), I would use scan.nextLine() again, and then parse the input. If you get a NumberFormatException, you can bark at the user that the input was invlaid.

The reason why you need to do something like this is that you still have a newline sitting at the end of your serverPort input. When you use nextInt(), the scanner grabs all of the next token and tries to convert it into an Integer. Anything after the Integer token remains to be scanned.

To prove this, with your original code, if you put a token separator, like a space, after your server port input and then add some text, you will find that your subsequent userName assignment will grab from the end of the number to the next newline.

    System.out.println("
Enter port number:");
    Integer serverPort = scan.nextInt();
    System.out.println("
Enter your username:");
    String userName = scan.nextLine();

    System.out.println("
serverPort: " + serverPort 
                     + "
userName: " + userName);

with the input:

    Enter port number: 
    123 abc
    Enter your username:

will output

   serverPort: 123
   userName:  abc

This is because the space is acting as a token separator, and after the scan.nextInt() is called, the space and the abc are still left in the buffer. When the subsequent scan.nextLine() is called, the space and the abc are scanned from the buffer.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...