【发布时间】:2013-05-28 05:03:11
【问题描述】:
我正在尝试通过 Scanner 对象读取命令。为了检查输入语法,我使用sc.hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我遇到了 JavaAPI 中描述为“可能阻塞并等待输入”的情况。
hasNext() 方法何时阻塞以及如何控制它?有趣的是,它在块前的 3 个案例中工作得非常好。此外,JavaAPI 将hasNext() 描述为检查是否存在另一个输入的正确方法,因此方法next() 不会产生Exception。
这是我到目前为止生成的代码:
if (sc.hasNext() && sc.next().equals("create")) {
if (sc.hasNextInt()) {
width = sc.nextInt();
if (width > 0) {
if (sc.hasNextInt()) {
heigth = sc.nextInt();
if (heigth > 0) {
if (sc.hasNext()) { //At this point the hasNext Statement blocks for //no reason till an Input is made.
charset = sc.next();
Image = new AsciiImage(width, heigth,charset);
} else {
ret = false;
System.out.println("INPUT MISMATCH");
}
} ...//and so on
提前致谢,我在这个主题上找不到任何我自己的东西。 编辑:扫描仪被定义为 System.in,但这不应该是一个问题 - 至少到目前为止还不是一个问题。
【问题讨论】:
-
如果没有可用的输入,您认为
hasNext应该返回什么?除了阻塞直到它看到流的结尾或下一个令牌,如何知道是否有将存在下一个令牌? -
当且仅当此扫描器具有 API 所述的另一个令牌时才为真。有点奇怪......我应该用什么代替?它也适用于我程序中的所有其他 hasNext 语句 - 在其他所有情况下:No Input --> false --> break.
-
不清楚您要做什么。您需要了解扫描仪基于流输入 - 如果当前没有可用数据但流未关闭,那么稍后可能会有更多数据......并且它必须等待该信息才能返回任何内容有用。
-
您正在使用阻塞 IO,并且您已通过调用
hasNext()请求输入。它会一直阻塞,直到有输入(并返回 true)或底层流关闭(并返回 false)。 -
看来你是对的,我完全误解了 hasNext() ......我确实用它来检查更多条目。这在一段时间内完全没问题,如果我想检查下一个单词是否是整数,这是有道理的。好吧,有点假设错了。感谢您的提示,由于与其他人无关,我是否应该删除此问题?