[英]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流程不会遵循最佳实践。 让我举个例子:假设Java进程有两个正在运行的线程-其中一个正在更新文件,另一个正在调用exit。 该文件可能已损坏。 因此,如果调用此方法,则最佳实践表明必须对关闭挂钩进行编程以解决这种情况。 这些挂钩应尝试关闭资源并进行其他类型的内务处理。
同样,这可能也会有所帮助:一旦调用System.exit(),将不会继续执行前进到该代码的代码。 因此,如果您有一个scanner.close(),除非它处于关闭挂钩中,否则将不会执行。 当然,操作系统将在进程出口上释放文件描述符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.