Java - System.exit() 和扫描仪

Java - System.exit() and scanner

假设我打开了扫描仪,无论是来自 System.in 还是来自文件,并且在程序中的某个时刻我正在激活 System.exit(),(并且没有调用scanner.close() 之前),它如何(以及是否)影响扫描仪?

我在想,既然 system.exit() 方法关闭了 JVM,那么与扫描器相关的所有内容都将正确关闭,但我没有找到关于该案例的任何具体信息。例如 - System.exit() 后,扫描仪打开的文件是否会被解锁("freed" 来自扫描仪)?在 scanner.close() 激活的所有相关进程是否也会在 System.exit() 被激活 "activated"?

Scanner 是一个流,所以当程序终止时,流会自动为您关闭,但是不关闭流是不好的做法,因为在更大更长的 运行 程序中它们会导致问题,所以是的一切正常关闭,但如前所述,这是不好的做法。

如果您必须同时打开多个流,它会因 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 进程),则 OS 将:

  • 使 java 进程使用的内存 (RAM) 可用,即释放内存。
  • java 进程持有的文件描述符被清除。这将包括它正在读取或写入的任何文件等。
  • 以此类推

但这并不意味着 Java 过程没有遵循最佳实践。让我举个例子:假设 java 进程有两个线程 运行 - 其中一个正在更新文件,另一个调用退出。该文件可能会损坏。因此,如果调用此方法,最佳实践要求对关闭挂钩进行编程以处理此类情况。这些挂钩应该尝试关闭资源并进行其他类型的管理。

也许这会有所帮助:一旦 System.exit() 被调用,接下来的代码将不会被执行。所以如果你有一个 scanner.close() 除非它在关闭挂钩中,否则不会被执行。当然,OS 将在进程退出时释放文件描述符。