为什么我们这样关闭扫描仪?

时间:2014-12-11 21:59:58

标签: java

我正在创建一个素性测试程序,这里有以下代码段。

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为空时,为什么我们不关闭扫描仪呢?

1 个答案:

答案 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();
}