簡體   English   中英

僅使用Scanner類的對象如何獲取輸入?

[英]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()

等待輸入掃描時,此方法可能會阻塞。

因此,一旦流開始提供輸入,該條件將得到滿足,並且該方法將阻止等待發生這種情況或發生Exception (例如:如果Scanner關閉)。

只要這些事情什么都沒有發生, hasNext()方法就不會返回,因此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()僅當輸入中包含另一個標記時才返回true 在您的情況下,這意味着InputStream已打開。

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

sc.nextLine()是問題所在。 假設您尚未更改System.in ,則控制台/終端將阻止循環(即,保持循環暫停),直到您輸入(輸入一些文本並按[ENTER] )為止。

因此,總體而言:

當且僅當有可能獲得更多輸入時, Scanner::hasNext()才會返回true(如果使用System.in ,則在關閉掃描儀之前始終為true)。
如果直接打印輸入,則不會存儲對其的任何引用,也不會為其分配任何內存(除非Scanner.nextLine()將其存儲在某個地方)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM