【问题标题】:java, programm not stopping for scan.nextLine()java,程序没有停止 scan.nextLine()
【发布时间】:2010-02-16 04:41:45
【问题描述】:

当我运行以下代码时,它会停止让我输入服务器名称和端口号,之后它应该停止并让我输入用户名,但它不会因为 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();

    }

【问题讨论】:

    标签: java


    【解决方案1】:

    我会再次使用scan.nextLine() 而不是scan.nextInt(),然后解析输入。如果您收到NumberFormatException,您可以向用户咆哮输入无效。

    你需要做这样的事情的原因是你的 serverPort 输入的末尾仍然有一个换行符。当您使用nextInt() 时,扫描程序会抓取所有下一个令牌并尝试将其转换为Integer。 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

    【讨论】:

    • 因为扫描器获取整数后,它会停在那里 - 留下用户在输入 int 后按下的换行符仍然可以读取。然后,当您调用 nextLine() 时,它会继续扫描流,找到换行符并停止。
    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多