0

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

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

给出 put 作为

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 指定输入结束。但在第二种情况下,我没有得到最后一句话(员工)。请解释。

4

3 回答 3

3

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

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

因此,与第二个代码快照不同,第二个代码不是“等待新输入”,因为它只请求in.next()一次,并且直到输入用尽为止。


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

  1. 空输入将失败。
  2. 它是与 while 循环内容的代码重复。
于 2013-02-02T07:57:02.720 回答
2

它不是关于in.next()问题的问题是使用if它只执行一次并且next()它只返回下一个令牌

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

于 2013-02-02T07:57:53.990 回答
0

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

public String next()

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

于 2013-02-02T07:54:26.543 回答