[英]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.