2017-05-24 119 views
2

假設我打開了一個掃描儀,無論是從System.in還是從一個文件,並且在程序中的某個點,我正在激活System.exit()(並且未調用scanner.close()之前),它如何(以及如果)影響掃描儀?Java - System.exit()和掃描儀

因爲system.exit()方法關閉了JVM,所以與掃描器相關的所有東西都會被正確關閉,但我沒有找到關於這種情況的任何具體信息。例如 - System.exit()之後,掃描儀打開的文件是否會被解鎖(從掃描儀中「釋放」)?在scanner.close()上激活的所有相關流程是否將被激活?以及System.exit()

回答

1

掃描儀是一個流,所以當程序終止流被自動關閉你的,但它是不好的做法,無法靠近溪流,因爲在較大較長的運行程序,他們可能會出現問題,所以是一切正確關閉,但如早些時候說這是不好的做法。

如果你必須在同一時間將OutOfMemoryError而崩潰開放的許多河流,這裏是這個

public static void main(String[] args) { 
LinkedList<Scanner> list = new LinkedList<>(); 
while(true) 
    list.add(new Scanner(System.in)); 
} 

一個例子,所以如果你沒有時間長了會導致此內存錯誤後關閉您的流也請注意,這個錯誤不會造成因爲在列表項太多是因爲流

編輯:

public static void main(String[] args) { 
    Scanner first = new Scanner(System.in); 
    Scanner second = new Scanner(System.in); 
    int x = first.nextInt(); 
    int y = second.nextInt(); 
    System.out.println("First scan returns: " + x); 
    System.out.println("Second scan returns: " + y); 
    first.close(); 
    second.close(); 
} 

,你可以看到您可以打開多個System.in掃描程序,但是當讀入變量時,您必須指定要使用的掃描儀對象。然而,當然這是毫無意義的,我不能想出爲什麼你需要一次打開多個System.in掃描器的任何原因。

+0

因此,掃描儀打開的所有文件都將在system.exit()處關閉。 您可以舉一個可選問題的例子,可以在較大的程序中發生嗎? – Mickey

+1

@Mickey是的,打開的所有文件和流都將像關閉方法一樣關閉,現在大型程序中可能發生的問題將是OutOfMemoryError,因爲您只能打開很多流一次,大多數程序甚至是大型程序都需要一段時間才能達到此限制,但是如果您有一臺服務器或需要長時間運行的程序,可能會導致程序崩潰。 – Joking313

+0

謝謝。 對於您在評論中編輯過的示例,是否可以打開多個'system.in'掃描器?據我所知你不能。 另外,如何將'OutOfMemoryError'連接到'System.exit()'部分?我不太明白這一點。 – Mickey

-1

我會用這種方式回答你的問題。 java進程運行的操作系統是一個寫得很好且經過無限測試的軟件。當一個進程退出時(例如java進程),那麼操作系統會:

  • 使可用的java進程使用的內存(RAM),即釋放內存。
  • Java進程保存的文件描述符被清除。這將包括任何正在讀取或寫入的文件等。
  • 依此類推。

但是,這並不意味着Java過程不會遵循最佳實踐。讓我舉個例子:假設java進程有兩個線程正在運行 - 其中一個正在更新文件,另一個正在調用exit。該文件可能會損壞。因此,如果調用此方法,最佳實踐規定關閉掛鉤已編程爲處理此類情況。這些鉤子應該嘗試關閉資源並進行其他類型的內務管理。

此外,也許這將有助於:一旦System.exit()被調用,那麼繼續執行它的代碼將不會被執行。因此,如果你有一個scanner.close(),除非它處於關閉鉤子中,否則它將不會被執行。當然,操作系統將釋放進程出口上的文件描述符。

+0

這並不是一個很好的例子,因爲一個文件可能會在完全單線程的程序中以這種方式變得'破壞',並且會關閉所有東西,退出鉤子等。 – pvg

+0

我剛剛給出了一個最佳實踐可能發生的例子沒有被遵守。從來沒有說過這是文件損壞的唯一方式。 :-) – Khanna111

+0

這實際上並不能說明爲什麼這些是「最佳實踐」,因爲它們實際上並不能阻止你聲稱他們預防了什麼。 – pvg