我正在创建一个素性测试程序,这里有以下代码段。
import java.util.Scanner;
public class LargestPrime {
public static boolean CheckPrimality(int num){
int factor = 1;
int limit = (int) Math.sqrt(num);
for(int i = 2; i<= limit; i++){
if(num % i == 0){
factor = i;
}
}
if(factor == 1){
return true;
}
else {return false;}
}
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.println("Please enter a number: ");
int number = reader.nextInt();
System.out.println(CheckPrimality(number));
if(reader != null){
reader.close();
}
}
}
我很困惑为什么我们在阅读器时关闭扫描仪!= null&#39;。当读者不为空时,这意味着扫描仪中仍有东西,对吧?当读者IS为空时,为什么我们不关闭扫描仪呢?
答案 0 :(得分:0)
直言不讳:你不应该关闭STDIN。您不知道应用程序的其他部分(即使是那些您未实现的部分)可能仍在使用该流。
我很困惑为什么我们在阅读器时关闭扫描仪!= null&#39;。当读者不为空时,这意味着扫描仪中仍有东西,对吗?
没有。这是Scanner
,其缓冲区中没有任何内容,但是非空:
Scanner scan = new Scanner(new File("file.txt"));
如果您想查看扫描仪中是否还有任何内容,则可以使用hasNext()
或hasNextLine()
,具体取决于您需要验证的内容。
当读者IS为空时,为什么我们不会关闭扫描仪呢?
那么我们会关闭什么? .close()
方法存在于Scanner
的实例上,如果是null
,那么我们就是这样做的:
Scanner badScanner = null;
badScanner.close(); // NullPointerException
如果您关注资源管理,Java 7中的Scanner
实现了AutoCloseable
,那么您可以使用try
- with-resources来处理关闭流(但请,不要STDIN)。
try(Scanner scan = new Scanner(new File("myFile.txt")) {
// work done with file
}
在Java 6及以下版本中,您可以使用try...finally
块来完成同样的事情。
Scanner scan = null;
try {
scan = new Scanner(new File("myFile.txt"));
// work done with file
} finally {
scan.close();
}