为什么我需要检查一个文件是否可以被读取两次(一次使用内置的 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
以这种方式调用,因为编译器会检查它们是否被处理。您必须提供 try
和 catch
匹配预期异常或其 parent。或者作为一个选项,使用 throws
子句声明该方法可能会抛出异常,然后在下游处理它(根据经验,请记住 checked exceptions
必须在某处进行处理)。
关于unchecked exceptions
- 这些是代码缺陷导致的异常。并由 RuntimeException
及其子类表示。
当您的代码尝试访问一个名为 FileNotFoundException
的文件 checked exception
时,必须对其进行处理。
有很多事情可能会导致 FileNotFoundException
:
- file-path错了;
- 文件存在,但无法访问(出于安全原因,另一个进程使用该文件等);
- 目标路径存在,但它是目录而不是文件。
即使之前成功访问了此文件,下次也可能会出现一些问题。每一段处理文件的代码都必须威胁 FileNotFoundException
或其 parent 之一,例如 `IOException' 只是因为文件系统以这种方式运行。
希望它能回答您的问题。
所以我正在审查我教授的项目代码(我的目标是理解所有内容)并且她验证了一个文件可以 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
以这种方式调用,因为编译器会检查它们是否被处理。您必须提供 try
和 catch
匹配预期异常或其 parent。或者作为一个选项,使用 throws
子句声明该方法可能会抛出异常,然后在下游处理它(根据经验,请记住 checked exceptions
必须在某处进行处理)。
关于unchecked exceptions
- 这些是代码缺陷导致的异常。并由 RuntimeException
及其子类表示。
当您的代码尝试访问一个名为 FileNotFoundException
的文件 checked exception
时,必须对其进行处理。
有很多事情可能会导致 FileNotFoundException
:
- file-path错了;
- 文件存在,但无法访问(出于安全原因,另一个进程使用该文件等);
- 目标路径存在,但它是目录而不是文件。
即使之前成功访问了此文件,下次也可能会出现一些问题。每一段处理文件的代码都必须威胁 FileNotFoundException
或其 parent 之一,例如 `IOException' 只是因为文件系统以这种方式运行。
希望它能回答您的问题。