为什么我需要检查一个文件是否可以被读取两次(一次使用内置的 File 方法,一次使用 Scanner)

Why do I need to check if a file can be read twice (once with built in File method once with Scanner)

所以我正在审查我教授的项目代码(我的目标是理解所有内容)并且她验证了一个文件可以 opened/read 三次,我不确定为什么这三次有必要。

1: if (!File.exists()) { } 使用 File 对象的内置 exists 方法检查文件是否存在

2:if (!File.canRead()){ 检查是否可以使用 File 对象上的内置 canRead 方法读取文件

3(不明白的部分):

Scanner blank = null; 
try {
            blank = new Scanner(File) ;
        } catch (FileNotFoundException e) { 
           do whatever
    }
        

我不明白为什么如果我们已经检查过文件是否可以使用 canRead 方法打开,为什么我们需要再次检查它是否可以使用扫描仪打开。

如有任何见解,我将不胜感激。谢谢

在本例中,您没有再次检查文件是否可以打开。

在您提供的代码片段中,创建了一个新的 Scanner 对象,对象 colorFile 通过括号传递给它。

catch 部分只是错误处理,如果文件不存在于驱动器上,它会抛出一个错误让您知道。

因为Scanner(File) can throw FileNotFoundException. It's part of the API, and a checked Exception. Thus, you have to catch it (or add throws to your own method). Finally, you should always close() your Scanner(s) when they wrap a File. Else you leak a file handle. The best way, in my opinion, would be try-with-resources statement.

您正确理解了 try/catch 背后的思想,首先您必须了解 Exceptions 是什么。

基本上,Exception 是一种特殊的 object,它包含与应用程序异常行为相关的信息。

Exceptions分为两类:

  • 已检查;
  • 未选中(运行时异常)。

Checked exceptions 表示 more or less expected 的情况(有些事情可能会出错,不是因为你的代码中的某个国王,而是因为 file system works this way 或因为 database works in such way,因为 network connection could fail,等等)。您的代码必须具有针对这些情况的场景。 Checked exceptions 以这种方式调用,因为编译器会检查它们是否被处理。您必须提供 trycatch 匹配预期异常或其 parent。或者作为一个选项,使用 throws 子句声明该方法可能会抛出异常,然后在下游处理它(根据经验,请记住 checked exceptions 必须在某处进行处理)。

关于unchecked exceptions - 这些是代码缺陷导致的异常。并由 RuntimeException 及其子类表示。

当您的代码尝试访问一个名为 FileNotFoundException 的文件 checked exception 时,必须对其进行处理。

有很多事情可能会导致 FileNotFoundException:

  • file-path错了;
  • 文件存在,但无法访问(出于安全原因,另一个进程使用该文件等);
  • 目标路径存在,但它是目录而不是文件。

即使之前成功访问了此文件,下次也可能会出现一些问题。每一段处理文件的代码都必须威胁 FileNotFoundException 或其 parent 之一,例如 `IOException' 只是因为文件系统以这种方式运行。

希望它能回答您的问题。