如何仅使用 Scanner class 的对象进行输入?

How input was taken just using object of Scanner class?

  public class Two {

public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    int c=0;
    while(sc.hasNext())System.out.println(++c+" "+sc.nextLine());

}
}

我遇到了这段代码,我想确认通过直接获取输入而不使用任何数据类型的对象,我们所做的只是获取输入并显示它,而不是将其存储在任何地方?

还有 while 循环中的条件是如何第一次为真?由于我们还没有给出任何意见。

当然,您的代码不存储 sc.nextLine() ,因此该值将在 System.out.println 指令之后被丢弃。

也适用于 hasNext()

This method may block while waiting for input to scan.

所以一旦流开始提供输入,条件就会满足,并且该方法将阻塞等待这种情况发生或 Exception 发生(例如:如果扫描仪关闭)。

只要这些事情都没有发生,hasNext() 方法就不会 return,所以 while 中的条件仍然没有被计算,所以循环被阻塞在那里。

让我们检查一下您的代码:

Scanner sc = new Scanner(System.in)

java.util.Scanner.Scanner(InputStream) 构造函数被调用,并且您有一个类型为 Scanner 的对象 sc,它读取自 System.in.

int c = 0;

您现在拥有原始类型 int 的原始 c

while(sc.hasNext()) { ... }

while 循环计算 sc.hasNext(),即 true。根据文档,当且仅当输入中包含另一个标记时,sc.hasNext() returns true。在您的情况下,这意味着 InputStream 已打开。

{... System.out.println(++c + " " + sc.nextLine()); ...}

sc.nextLine() 是问题所在。假设您没有更改 System.in,console/terminal 将阻止循环(即保持循环暂停),直到您给它一个输入(输入一些文本并点击 [ENTER])。

总的来说:

当且仅当可以获得更多输入时,

Scanner::hasNext() 才会 return 为真(如果您使用 System.in,这将始终为真,直到您关闭扫描仪) .
如果您直接打印输入,则不会存储对它的任何引用,也不会为其分配内存(除非 Scanner.nextLine() 将其存储在某处)。