繁体   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