Java, программа не останавливается для scan.nextLine () - PullRequest
1 голос
/ 15 февраля 2010

Когда я запускаю следующий код, он останавливается, чтобы позволить мне ввести имя сервера и номер порта, после чего он должен остановиться и позволить мне ввести имя пользователя, но он никогда не останавливается для scan.nextline () и вылетает прямо для ввода имени получателя. ??

public static void main(String[] args) throws IOException {
    try {
        System.out.println("\n\n\nTCP Chat Client\n\nEnter server name:");
        Scanner scan = new Scanner(System.in);

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

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


        System.out.println("Enter your username:\n");
        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();

    }

1 Ответ

4 голосов
/ 15 февраля 2010

Вместо scan.nextInt() я бы снова использовал scan.nextLine(), а затем проанализировал ввод. Если вы получаете NumberFormatException, вы можете лаять на пользователя, что ввод был инкрустацией.

Причина, по которой вам нужно сделать что-то вроде этого, заключается в том, что у вас все еще есть символ новой строки, расположенный в конце ввода вашего serverPort. Когда вы используете nextInt(), сканер захватывает весь следующий токен и пытается преобразовать его в Integer. Все, что находится после целочисленного токена, остается сканировать.

Чтобы доказать это, с вашим исходным кодом, если вы поместите разделитель токенов, например, пробел, после ввода порта сервера, а затем добавите какой-то текст, вы обнаружите, что ваше последующее назначение userName будет получено с конца номер до следующей новой строки.

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

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

с вводом:

    Enter port number: 
    123 abc
    Enter your username:

выведет

   serverPort: 123
   userName:  abc

Это потому, что пробел действует как разделитель токенов, и после вызова scan.nextInt() пробел и abc все еще остаются в буфере. Когда вызывается последующий scan.nextLine(), пробел и abc сканируются из буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...