首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java,程序员不会因为scan.nextLine()而停止

java,程序员不会因为scan.nextLine()而停止
EN

Stack Overflow用户
提问于 2010-02-16 04:07:19
回答 1查看 4K关注 0票数 2

当我运行下面的代码时,它会停下来让我输入服务器名和它们的端口号,然后它应该会停下来让我输入用户名,但它从来不会停下来等待scan.nextline(),而是直接飞到输入接收者的名字??

代码语言:javascript
复制
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();

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-16 04:10:30

我将再次使用scan.nextLine()而不是scan.nextInt(),然后解析输入。如果你得到了一个NumberFormatException,你可以对用户说输入被破坏了。

之所以需要这样做,是因为在serverPort输入的末尾仍然有一个换行符。当您使用nextInt()时,扫描程序会抓取所有下一个令牌,并尝试将其转换为Integer。Integer令牌之后的任何内容都需要扫描。

为了证明这一点,使用您的原始代码,如果您在服务器端口输入后添加一个记号分隔符,如空格,然后添加一些文本,您将发现后续的userName赋值将从数字的末尾抓取到下一个换行符。

代码语言:javascript
复制
    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);

使用输入:

代码语言:javascript
复制
    Enter port number: 
    123 abc
    Enter your username:

将输出

代码语言:javascript
复制
   serverPort: 123
   userName:  abc

这是因为空格充当令牌分隔符,并且在调用scan.nextInt()之后,空格和abc仍然留在缓冲区中。当调用后续的scan.nextLine()时,将从缓冲区扫描空间和abc

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2268598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档