in.next()在做什么?

时间:2013-02-02 07:52:45

标签: java io java.util.scanner

  

我正在使用Scanner类来获取输入。我想要得到所有的   使用in.next()的行中的单词。我知道可以用它来完成   nextLine()但我想了解in.next()和in.hasNext()   的工作原理。

System.out.println("What is designation");
        String desg = in.next();      
        while(in.hasNext()){
            desg+=in.next();      
        }

给出了

What is designation
member technical staff\n
^Z
Hello abhishek kumarNext year you will be 22Salary is 30000.0Designation is membertechnicalstaff

但如果我使用

System.out.println("What is designation");
        String desg = in.next();      
        if(in.hasNext()){
            desg+=in.next();      
        }

它输出为

What is designation
member technical staff
Hello abhishek kumarNext year you will be 22Salary is 44254.0Designation is membertechnical
  

在第一种情况下,我得到所有的话,但它一直在要求   下一个输入,我必须使用CTRL + Z指定输入结束。但在   第二种情况我没有得到最后一个字(工作人员)。请解释一下。

3 个答案:

答案 0 :(得分:3)

第一个代码在while循环中读取输入 - 即直到找到in.hasNext() == false

第二个代码使用的是if条件 - 它最多只读取in.next()一次(在初始读取后)。

因此,第二个代码不是“等待新输入”,因为它只询问in.next()一次,而不是在输入用尽之前,与第二个代码快照不同。


P.S。请注意,行String desg = in.next();(在第一个代码快照中)是一种不好的做法,原因有两个:

  1. 空输入将失败。
  2. 这是与while循环内容的代码重复。

答案 1 :(得分:2)

问题不在于in.next()问题在于使用if它只执行一次 约next()只有才能返回下一个标记

所以第二种情况:( if一个) 当您输入成员技术人员时 在这一部分:String desg = in.next();member被分配到desg 在输入if后,它会检查下一个令牌(技术)并将其与前一个字符串desg+=in.next()连接起来 现在desg成为membertechnical

答案 2 :(得分:0)

如果您想了解有关API中类的更多详细信息,javadoc是最佳来源。这是javadoc for Scanner

public String next()
  

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