java.util.Scanner 不返回提示符

发布于 2024-11-30 06:12:52 字数 313 浏览 1 评论 0原文

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            System.out.println(s.next());
        }
        s.close();
    }
}

该程序不会返回提示符(我一直通过终端运行它)。这是为什么?我怎样才能纠正它?

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            System.out.println(s.next());
        }
        s.close();
    }
}

This program does not return to prompt (I have been running it through the Terminal). Why is that? How can I correct it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

亽野灬性zι浪 2024-12-07 06:12:52

该程序不会返回提示(我一直通过终端运行它)。这是为什么?

因为 s.hasNext() 将阻塞,直到有更多输入可用,并且只有在遇到流末尾时才会返回 false。

来自文档:

如果此扫描器的输入中有另一个标记,则返回 true。 此方法可能会在等待扫描输入时阻塞。

在 unix 系统上,您可以通过键入 Ctrl+D 来结束流它正确地将控制返回到提示符,(或通过键入 Ctrl+C 终止整个程序)。

我该如何纠正它?

您可以

  • 按照 JJ 的建议保留一些用于终止程序的输入字符串,或者
  • 您可以依靠用户关闭输入流Ctrl+D,或者您可以
  • 将循环包含在 try/catch 中,并让另一个线程中断主线程,然后主线程正常退出。
  • 从另一个线程以编程方式执行 System.in.close() 。

This program does not return to prompt (I have been running it through the Terminal). Why is that?

Because s.hasNext() will block until further input is available and will only return false if it encounters end of stream.

From the docs:

Returns true if this scanner has another token in its input. This method may block while waiting for input to scan.

On a unix system you can end the stream by typing Ctrl+D which correctly returns control to the prompt, (or terminate the whole program by typing Ctrl+C).

How can I correct it?

You can either

  • reserve some input string used for terminating the program, as suggested by JJ, or
  • you could rely on the user closing the input stream with Ctrl+D, or you could
  • enclose the loop in a try/catch and let another thread interrupt the main thread which then exits gracefully.
  • do System.in.close() programatically from another thread.
疑心病 2024-12-07 06:12:52

这是对上面评论的回复。这里,当收到“quit”时,应用程序将退出。

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            String temp = s.next();
            if(temp.trim().equals("quit"))
                System.exit(0);
            System.out.println(s.next());
        }
        s.close();
    }
}

This is a reply to a comment above. Here, the application will quit when receiving "quit".

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            String temp = s.next();
            if(temp.trim().equals("quit"))
                System.exit(0);
            System.out.println(s.next());
        }
        s.close();
    }
}
薄情伤 2024-12-07 06:12:52

扫描仪将阻止等待来自 System.in(标准输入)的输入。您必须按 Ctrl+C 退出程序,按 Ctrl+D 关闭输入流或为循环提供退出条件(例如输入“quit”),以下是执行此操作的方法:

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            String nextVal = s.next();
            if (nextVal.equalsIgnoreCase("quit")) { break; }
            System.out.println(nextVal);
        }
        s.close();
    }
}

The Scanner will block waiting for input from System.in (standard input). You have to press Ctrl+C to exit the program, close the Input stream by pressing Ctrl+D or give the loop an exit condition (like typing "quit"), here is how you could do that:

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            String nextVal = s.next();
            if (nextVal.equalsIgnoreCase("quit")) { break; }
            System.out.println(nextVal);
        }
        s.close();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文