2016-02-26 28 views
0
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()); 

} 
} 

我遇到了這段代碼,我想確認,通過直接輸入而不使用任何數據類型的對象,我們所做的只是輸入並顯示它,而不是將它存儲在任何地方?如何僅使用Scanner類的對象進行輸入?

以及第一次true while循環的條件如何?因爲我們還沒有給出任何輸入。

回答

0

當然,你的代碼不會存儲sc.nextLine(),所以這個值將被丟棄超過System.out.println指令。

同樣對於hasNext()

在等待輸入掃描此方法可能阻塞。

所以一旦流開始提供輸入條件將得到滿足,並且該方法將阻塞等待這種情況發生或Exception發生(例如:如果掃描儀被關閉)。

只要沒有發生這些事情,hasNext()方法不會返回,因此while中的條件仍未計算,因此循環在此處被阻止。

+0

可以請你再解釋一下while()循環是如何工作在這段代碼中的,我的意思是我無法理解hasNext()如何封鎖while() – shiwchiz

+0

我更新了答案,我希望它解釋得更好。 – Berger

0

讓我們通過代碼:

Scanner sc = new Scanner(System.in)

java.util.Scanner.Scanner(InputStream)構造函數被調用,你必須Scanner類型從System.in讀取的對象sc

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,這將始終,直至關閉掃描儀是真實的)。
如果您直接打印輸入,則不會存儲對其的任何引用,也不會爲其分配內存(除非Scanner.nextLine()將其存儲在某處)。

+0

謝謝,但是,如果「當且僅當輸入中有另一個標記」,你是什麼意思? – shiwchiz

+0

所以,如果輸入可以被讀取,它將返回'true',但只有在。所以,如果沒有什麼可讀的,它會返回'false'。 – HyperNeutrino

相關問題