使用以下代码,我可以使用/不使用扫描仪关闭方法生成相同的输出。
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");
}
}
}
答案 0 :(得分:5)
简短回答:否,但在许多情况下非常明智这样做。
扫描仪适用于某种资源。这可以是String
,但在许多情况下,它可以是标准输入通道,文件,网络流或其他资源。
对stdin
来说,这不是什么大问题。 stdin
通常与您的申请一起生活(并死亡)。最好不要关闭流,因为可能另一个对象有兴趣从标准输入通道读取。
如果您从files / network / driver /中读取...这意味着Java首先询问操作系统是否可以使用该资源。这意味着资源已分配给应用程序。其他希望写入文件的应用程序(或者在程序写入文件时读取和写入)是(至少是临时的)拒绝访问该资源。因此,尽快放弃资源是有意义的。
然而,最后一个方面并没有义务。 Java虚拟机将在终止/垃圾收集器通过时关闭程序不再可访问的资源。此外,如果您的Java应用程序被另一个程序杀死(终止),操作系统肯定会释放资源......
然而,尽快放弃资源是很有礼貌的(不要太过于字面意思,如果你在几秒钟后释放它们,这不是一个大问题)。此外,不及早放弃资源可以使系统进入死锁或活锁。在死锁的情况下,两个程序正在等待资源在保持其他资源时再次可用。由于没有一个程序放弃自己的资源,程序将永远等待。如果发生这种情况,系统会卡住。
最后,活动资源也会导致额外的内存/ CPU使用量。在所有操作系统管理这些资源之后,因此可以合理地假设要管理它们,它们将使用少量的CPU。在许多情况下,活动文件(部分)加载到内存中。网络资源也是如此......总的来说,足迹并不是非常庞大,但你可以想象如果所有程序在资源终止之前都会保留资源,这会产生很大的影响。
答案 1 :(得分:1)
不,它不是强制性的,但如果您有Caller和Reader类。来电者不应该知道Reader的实现。在读者的下一个方法中:
while scanner has object
read them ( one object per method's call)
when objects are done
close the reader.