在下面的SSCCE中,即使我从给定的位置/路径中删除此文件,即FileNotFoundException
"D:\\Eclipse Workspaces\\SAMPLES AND OTHER SNIPPETS\\SoapCallResults.txt"
相反,PrintWriter
似乎创建了文件,如果找不到它。
如果Printwriter
创建了文件,如果找不到,我们为什么要尝试处理FileNotFoundException
(编译器抱怨,如果我们不用try/catch
包围它或当它永远不会被抛出时添加一个throws
子句?
package com.general_tests;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class PrintWriterFileNotFoundExceptionTest {
public static void main(String[] args) {
String myName = "What ever my name is!";
PrintWriter printWriter = null;
try {
printWriter = new PrintWriter("D:\\Eclipse Workspaces\\SAMPLES AND OTHER SNIPPETS\\SoapCallResults.txt");
printWriter.println(myName);
} catch (FileNotFoundException e) {
System.out.println("FILE NOT FOUND EXCEPTION!");
e.printStackTrace();
} finally {
if (printWriter != null) { printWriter.close(); }
}
}
}
答案 0 :(得分:3)
FileNotFoundException
是一个经过检查的异常,它只是转换为您必须捕获它或将其添加到throws子句中。
我希望这可以回答你关于为什么我们确实需要它的问题,即使创建了一个文件 - 如果不存在 -
来自javadoc -
FileNotFoundException - If the given file object does not denote an existing, writable regular file and a new regular file of that name cannot be created, or if some other error occurs while opening or creating the file
答案 1 :(得分:2)
使用Eclipse Workspaces
替换路径中的foo
,看看是否收到异常。可以创建文件本身,但不能创建它上面的整个路径。
您也可以完全保留路径,但在文件上设置只读,隐藏和系统属性。操作系统将无法编写或创建它。
另一种变体:修改文件的ACL,这样您的用户就没有写入权限。
还有更多。
答案 2 :(得分:1)
FIleNotFoundException是一个已检查的异常。如果您的代码块丢弃它们,您需要处理这些类型的异常。对于未经检查的异常类型,您不必处理(非强制)。你能真的保证文件是否已创建,但没有损坏或磁盘记录是否已损坏?另外,请看一下 - Java: checked vs unchecked exception explanation。
主要的是你的构造函数抛出了FileNotFoundException(看这里 - https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#print%28char%29),你必须抓住它(因为它被检查)。
提示 - 对于Eclipse,请尝试查看ctrl + SPACe显示的对象方法。如果您的JavaDoc位于正确的位置,您将看到方法正在执行的所有解释,包括“抛出:SomeException”位。这是调用方法时需要查找的内容(即,是否需要尝试使用catch块)。