当前位置: 首页 > 知识库问答 >
问题:

Java Scanner next() 方法

爱琪
2023-03-14

这是来自Java的Scanner next()方法的解释:

此方法可能会在等待输入扫描时阻塞,即使先前调用hasNext()返回true。

如果调用了hasNext(),这个方法如何等待用户输入?如果我们调用hasNext()并返回true,我们知道有下一个标记,那么next()方法是如何以及为什么这样做的?

共有3个答案

漆雕欣德
2023-03-14

如果调试以下代码,您将看到,实际上,它是具有Next()方法,该方法正在阻止并等待用户输入:

Scanner scanner = new Scanner(System.in);
if (scanner.hasNext()) {
    String s = scanner.next();
}

这是因为hasNext()中有一个阻塞步骤:

public boolean hasNext() {
    ensureOpen();
    saveState();
    while (!sourceClosed) {
        if (hasTokenInBuffer())
            return revertState(true);
        readInput(); //THIS IS WAITING FOR USER INPUT
    }
...

在控制台输入的情况下,hasNext()一直等到输入完整的令牌并返回true,然后后续的Next()调用不会阻塞。

在非控制台输入的情况下, 即使没有完整的令牌, hasNext() 返回 true,随后的 next() 调用阻塞并等待完整的令牌。

丁鸿云
2023-03-14

Scanner#next不会返回字符串,直到它到达Scanner使用的分隔符(空格是默认分隔符),或者它到达输入流的末尾。

如果 hasNext 返回 true,则表示输入流中肯定有更多数据,但在到达分隔符/EOF 之前,它可能仍需要阻塞。

左丘源
2023-03-14

您需要阅读该方法的完整文档:

查找并返回此扫描程序中的下一个完整令牌。完整标记的前面和之后是与分隔符模式匹配的输入。此方法可能会在等待输入扫描时阻塞,即使以前调用的 hasNext() 返回 true 也是如此。

当有另一个令牌时,Scanner#hasNext方法(留档)可能会返回true。但根据分隔符模式,该令牌可能尚未被视为完整,并且Scanner#next将始终阻塞,直到令牌完成。

如果Scanner中有一个完整的令牌,则Scanner#next

您可以使用Scanner#useDelimiter方法(文档)设置分隔符模式

如果您没有设置特定的分隔符模式,Scanner将使用与空白字符匹配的默认模式。

正如您所问,阻塞意味着方法等待并且直到所述事件发生才返回。

请考虑以下情况:

System.out.println("Before");
someBlockingMethod();
System.out.println("After");

public void someBlockingMethod() {
    // Sleep for a second (ignoring exceptions for simplicity)
    Thread.sleep(1000);
}

您将看到someBlockingMethod()返回一次之后,这只会在所述事件发生后发生。因此,该方法会阻塞。在这个例子中,方法阻塞了一秒钟。

 类似资料:
  • 例如,我如何做到这一点? 和 像这样的东西,我试着在网上搜索,但我找不到任何关于这方面的教程,所以我在这里问。

  • 只是想知道为什么 调用world\u开关: 结果没有任何变化,我想增加或减少实例变量@pos\u X或@pos\u Y 这是我的初始化方法 这就是我如何创建类的实例 我们将不胜感激

  • 本文向大家介绍iOS hitTest方法&pointInside方法相关面试题,主要包含被问及iOS hitTest方法&pointInside方法时的应答技巧和注意事项,需要的朋友参考一下 hitTest方法 当事件传递给控件的时候,就会调用控件的这个方法,去寻找最合适的view point:当前的触摸点,point这个点的坐标系就是方法调用者   pointInside方法 作用:判断当前这个

  • 书籍与公开课 我喜欢看一些有关基础原理的书,如操作系统、计算机网络等。但是最近在看《计算机网络:自顶向下方法》的时候发现,这些书都太大而全了,让人看着很吃力,而且抓不住重点。 知名大学都有公开课,视频比枯燥的书要更好,也讲的更有侧重点。我觉得以后可以跟着公开课来看书: 如果不知道某个科目要看什么书,可以跟着公开课学习,看参考教材 如果已经确定要读某本经典书,可以先找有没有公开课 这些公开课可以在知

  • 主要内容:Python类实例方法,Python类方法,Python类静态方法和类属性一样,类方法也可以进行更细致的划分,具体可分为 类方法、 实例方法和 静态方法。 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。 其中 @classmethod 和 @staticmethod 都是函数装饰器,后续章节会对其做详

  • Methods 方法 Pointers vs. Values 指针 vs. 值 As we saw with ByteSize, methods can be defined for any named type (except a pointer or an interface); the receiver does not have to be a struct. 正如 ByteSize 那样

  • 方法 是关联了特定类型的函数。类,结构体以及枚举都能定义实例方法,方法封装了给定类型特定的任务和功能。类,结构体和枚举同样可以定义类型方法,这是与类型本身关联的方法。类型方法与 Objective-C 中的类方法相似。 事实上在 结构体和枚举中定义方法是 Swift 语言与 C 语言和 Objective-C 的主要区别。在 Objective-C 中,类是唯一能定义方法的类型。但是在 Swift

  • 本页包含内容: 实例方法(Instance Methods) 类型方法(Type Methods) 方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Objective-C 中的类方法(class methods)相似。 结构体和枚举能够定义方法是 Swif