当前位置: 首页 > 面试题库 >

Java,程序不会停止进行scan.nextLine()

姬墨竹
2023-03-14
问题内容

当我运行以下代码时,它停下来让我输入服务器名和它们的端口号,此后应该停下来让我输入用户名,但它永远不会暂停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();

    }

问题答案:

代替scan.nextInt(),我将scan.nextLine()再次使用,然后解析输入。如果得到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从缓冲器扫描。



 类似资料:
  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是,如果将其强行杀死(),它们将不会执

  • 问题内容: 我正在尝试使用Linux下的ProcessBuilder类将mp3文件解码为wav文件。由于某些原因,该过程不会停止,因此我必须手动取消它。 有人可以给我一个提示。我认为引用的代码很容易重现: jstack的输出 问题答案: 您需要清空进程的输出(通过)和错误(通过)流,否则可能会阻塞。 引用过程文档: 由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子流程的

  • 我正在使用ProcessBuilder启动一个外部进程,但我需要能够杀死它。现在,我没有问题杀死进程,但由于某种原因,错误流没有关闭,所以读取流的线程永远不会完成。这让我无法关闭我的程序。 从这里开始线程读取输入和错误流。 这是我用来停止该进程的代码。 我从来没有得到“error end”,调试程序显示线程只是位于“readline()”。 等待进程的代码在它自己的线程中运行(与终止进程的代码分开

  • 问题内容: 我的屏幕录制应用程序中有一个线程无法配合: 多年来一直困扰着我。它会定期将屏幕截图带到指定区域。 当您开始录制时,它会隐藏(缩小)窗口。在Mac上,当您以应用程序为焦点时,所有隐藏的窗口都会激活。在我的课程中(我已经确认可以工作),我有: 所以应该发生的是,当他单击应用程序时,截屏线程将停止。但是,我必须残酷地搞砸一些东西,因为当线程运行时,它甚至不会让窗口重新出现。这是我的第一个话题

  • 问题内容: 我有一个侦听端口的简单TCP服务器。 我先将其启动,然后在Mac上使用Ctrl + Z将其关闭。当我尝试再次运行它时,出现以下错误消息: 我是否以错误的方式关闭程序?如何防止这种情况发生? 问题答案: 要结束程序,您应该使用+ 。如果这样做,它会发送,从而允许程序正常结束,并与正在侦听的任何端口解除绑定。 另请参阅:https : //superuser.com/a/262948/48

  • 问题内容: 我有以下代码: 在发生某些事件之后,我应该停止在的方法中声明的操作,该方法实现。 我怎样才能做到这一点?我无法关闭执行器,只能撤消我的定期任务。我可以用吗?如果可以的话,请告诉我它将如何工作。 问题答案: 使用。该是你的任务的处理。您需要取消此任务,它将不再执行。 实际上,是签名,并将其与参数一起使用将导致当前正在运行的执行线程被调用中断。如果线程在阻塞的可中断调用(例如)中等待,则会