2014-03-07 24 views
0

我目前在兩個獨立的類中使用了兩個不同類型的掃描儀:這兩個掃描儀都採用用戶輸入來執行不同的操作。調用第一個掃描程序正常工作,但當我嘗試調用第二個掃描程序時,即使在關閉第一個掃描程序後,它也會將輸入註冊爲空。在不同的類中創建兩個掃描儀

1級

Scanner scan = new Scanner(System.in); 
public void foobar(){ 
    System.out.println("Enter data: "); 
    String foo = scan.next(); 
    scan.close(); 
    class2.function(foo); 
} 

2級

Scanner scan1 = new Scanner(System.in); 
public void foobar1(String foo){ 
    System.out.println("Enter more data: "); 
    String fooo = scan1.Next(); 
    //Automatically prints null here and closes program 
} 

我應該只使用一臺掃描儀不知何故?還是以其他方式使用Scanner類?謝謝!

+0

可以請你告訴我你爲什麼需要這個? –

+0

也許創建一個擁有你的掃描器並讓其他類擴展這個類的類? – donfuxx

+0

使用'scan.reset();'而不是'scan.close();' – Sarz

回答

3

scan.close();也關閉System.in,以便不能從流中讀取更多數據。因此,當您從scan1開始讀取時,System.in將不再返回任何數據。

因此,如果您對所有實例使用相同的輸入流,請不要關閉任何Scanner實例,直到完成所有掃描。

查看Scanner#close()的文檔瞭解更多信息。

關閉此掃描儀。 如果這個掃描器還沒有關閉,那麼如果它的底層可讀也實現了可關閉接口,那麼可讀的關閉方法將被調用。

如果你看看System.in的文檔,你可以看到,它確實實現了Closeable接口。

因此InputStream#close()被調用,並關閉InputStream讓你沒有輸入流從中讀取數據。

關閉此輸入流並釋放與該流關聯的所有系統資源。

+1

謝謝!這很有意義 – TwoShorts

1

無需創建兩個掃描儀,可以使用相同的Scanner兩個因爲一旦掃描是關閉的流System.in也得到關閉。 喜歡:

Scanner scan = new Scanner(System.in); 
public void foobar(){ 
    System.out.println("Enter data: "); 
    String foo = scan.next(); 
    class2.function(foo,scan); 
} 

其中:

public void function(String foo,Scanner scan1){ 
    System.out.println("Enter more data: "); 
    String fooo = scan1.next(); 
    System.out.println(fooo); 
} 

但仍,如果你需要創建兩個掃描儀使用scan.reset();,而不是在class1的scan.close();

+0

這也很有道理!謝謝!我一定會在下次使用這個。 – TwoShorts

+0

歡迎.. :) !!! – Sarz