使用下面的代码,无论是否使用 Scanner
close
方法,我都能够产生相同的输出。
import java.util.Scanner;
class CheckPassFail
{
//Write a program called CheckPassFail which prints "PASS" if the int variable "mark" is more than or equal to 50; or prints "FAIL" otherwise.
static int k;
static String str;
public static void main(String arg[])
{
System.out.println("Enter the marks : ");
Scanner typein = new Scanner(System.in);
str = typein.nextLine();
typein.close(); //Scanner Close
k = Integer.parseInt(str);
if(k>=50)
{
System.out.println("PASS");
}
else
{
System.out.println("FAIL");
}
}
}
简短的回答:不,但在许多情况下非常建议这样做。
扫描仪适用于某种资源。这可以是一个
String
,但在许多情况下,它可以是标准输入通道、文件、网络流或其他资源。
对于
stdin
来说,这不是什么大问题。 stdin
通常与您的应用程序一起存在(和消亡)。最好不要关闭流,因为也许另一个对象有兴趣从标准输入通道读取数据。
但是,如果您从文件/网络/驱动程序/...读取,这意味着 Java 首先询问操作系统是否可以使用该资源。这意味着资源已分配给应用程序。希望写入该文件(或在您的程序应写入该文件的情况下读取和写入)的其他应用程序(至少是暂时的)被拒绝访问该资源。因此尽快放弃资源是很有趣的。
但是最后一个方面不是必须的。 Java 虚拟机将在终止/垃圾收集器经过时关闭程序不再可访问的资源。此外,如果您的Java应用程序被您(另一个程序)杀死(终止),操作系统肯定会释放资源,...
然而,尽快放弃资源是有礼貌的(不要太字面意思,如果你在几(毫秒)秒后释放它们,这并不是一个大问题)。此外,不尽早放弃资源可能会使系统陷入“死锁”或“活锁”。在死锁的情况下,两个程序正在等待一个资源再次可用,同时保留另一个资源。由于没有一个程序放弃自己的资源,因此程序将永远等待。如果发生这种情况,系统就会卡住。 最后,活动资源还会导致额外的内存/CPU 使用。毕竟操作系统管理这些资源,因此可以合理地假设为了管理它们,它们将使用少量的 CPU。在许多情况下,活动文件被(部分)加载到内存中。网络资源也是如此,...一般来说,占用空间不是很大,但是您可以想象,如果所有程序都保留资源直到它们终止,这将产生很大的影响。
不,这不是强制性的,但如果您有 Caller 和 Reader 课程。调用者不应该知道 Reader 的实现。在读者的下一个方法中:
while scanner has object
read them ( one object per method's call)
when objects are done
close the reader.