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

时间:2016-02-26 15:46:36

标签: java java-7

  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());

}
}

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

以及第一次循环中的条件是如何真实的?因为我们尚未提供任何意见。

2 个答案:

答案 0 :(得分:0)

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

同样适用于hasNext()

  

此方法可能会在等待输入扫描时阻塞。

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

只要这些事情都没有发生,hasNext()方法就不会返回,所以while中的条件仍未被评估,因此循环被阻止。

答案 1 :(得分:0)

我们来看看你的代码:

Scanner sc = new Scanner(System.in)

调用java.util.Scanner.Scanner(InputStream)构造函数,并且您有sc类型的对象Scanner,该对象从System.in读取。

int c = 0;

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

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

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

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

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

所以,总的来说:

Scanner::hasNext()将返回true,当且仅当可以获得更多输入时(如果您使用System.in,在关闭扫描仪之前,这将始终为真。)
如果您直接打印输入,则不会存储对它的任何引用,也不会为其分配任何内存(除非Scanner.nextLine()将其存储在某处)。