Java PrintWriter:如果找不到文件会自动创建,为什么我们要处理FileNotFoundException?

时间:2014-11-19 11:47:06

标签: java file printwriter

在下面的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(); }
        }

    }

}

3 个答案:

答案 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块)。