簡體   English   中英

Java-System.exit()和掃描儀

[英]Java - System.exit() and scanner

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

我一直在思考,因為system.exit()方法關閉了JVM,所有與掃描程序關聯的東西都將被正確關閉,但是我沒有找到有關該情況的任何特定信息。 例如-在System.exit()之后,由掃描儀打開的文件是否將被解鎖(從掃描儀“釋放” System.exit() System.exit()是否也將“激活”在scanner.close()處激活的所有相關進程?

掃描儀是一個流,因此當程序終止時,流將自動為您關閉,但是不關閉流是個壞習慣,因為在運行時間較長的較大程序中,它們可能會引起問題,因此可以正常關閉所有內容,但是正如前面所說,壞習慣。

如果您一次要打開許多流,它將因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掃描儀的任何原因。

我會這樣回答您的問題。 運行Java進程的OS是編寫良好且經過無限測試的軟件。 當某個進程退出(例如Java進程)時,操作系統將:

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

但這並不意味着Java流程不會遵循最佳實踐。 讓我舉個例子:假設Java進程有兩個正在運行的線程-其中一個正在更新文件,另一個正在調用exit。 該文件可能已損壞。 因此,如果調用此方法,則最佳實踐表明必須對關閉掛鈎進行編程以解決這種情況。 這些掛鈎應嘗試關閉資源並進行其他類型的內務處理。

同樣,這可能也會有所幫助:一旦調用System.exit(),將不會繼續執行前進到該代碼的代碼。 因此,如果您有一個scanner.close(),除非它處於關閉掛鈎中,否則將不會執行。 當然,操作系統將在進程出口上釋放文件描述符。

暫無
暫無

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

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