1

我刚刚学会了如何使用异常,我对 RuntimeExceptions 有点困惑,因为这些特别是未经检查的。所以我有这个代码:

    String path = "foo/bar/local/stuff.txt";
    File file = new File(path);

如果找不到该路径,这不是 FileNotFoundException 吗?如何在我的方法中指定它?在这一步之后,我也会这样做:

    File[] listFiles = file.listFiles();

如果出现以下情况,这是否也会引发异常:
1. 它不是目录,而是文件。
2.它不存在。

抱歉,如果这似乎是新手问题,我仍然不知道如何使用异常。有人可以澄清一下吗?

4

6 回答 6

1

好的,我正在添加代码,所以我将添加一个新的答案。如果文件不是目录,listFiles 方法将返回 null。要抛出您自己的异常,请执行以下操作:

public void exampleMethod() throws Exception {
    File[] files = someFile.listFiles();
    if(files == null) {
        throw new Exception("File is not a directory, and as such cannot list files");
        //You can also create your own exception class (extends Exception), and explicitly throw that, rather than just a general Exception
        return;
    }

}

如果你只是想让它打印这些东西,而不是抛出异常,那就做

new Exception("blah").printStackTrace();
于 2012-08-07T02:24:41.430 回答
0

您仍然可以在签名中声明您的方法抛出的异常:

public void foo() throws FileNotFoundException
于 2012-08-07T02:08:41.223 回答
0

File(String) 构造函数不能抛出 FileNotFoundException,因此您不需要为问题的前半部分做任何特别的事情。

File#listFiles()也不会抛出 FileNotFoundException。如果访问被拒绝,它可以抛出 SecurityException,但就是这样。如果文件不是目录或不存在,则该方法只返回 null,因此您应该在使用列出的文件之前对其进行 nullcheck。

File[] files = file.listFiles();
if (files != null) {
    // file exists and is a directory
    // interact with files
}

至于实际使用异常,throws如果您希望通知编译器该方法可能会抛出所指出的异常,并且您的方法不处理抛出该异常的事件,则可以添加一条语句。

public void someMethod() throws IOException, SecurityException { /*...*/ }
于 2012-08-07T02:09:51.820 回答
0

File是虚拟的概念。在 Java 中 aFile被允许不存在(这就是我们拥有 的原因File.exists())。这允许您指定一个“可能的”位置(例如用于写入)。

它还允许检查所需文件是否存在,允许开发人员做出决定(覆盖文件,不加载文件,对锁定文件执行其他操作)

listFiles是另一种野兽。IOException可以说,如果您尝试列出“文件”或目录不存在,它可能应该抛出某种。自 Java 1 以来,它一直是 API 的一部分。这表明当时的设计范式与我们过去所知道的不同。

Properties您可以在对类的更改中看到这一点,该类save已被弃用,store因为它会抛出一个IOException

Java 7 引入了一个新的 API 来帮助改进其中的一些缺点,并为文件操作引入了一个更好的工作模型

于 2012-08-07T02:13:02.270 回答
0

首先,根据文档

public File(String pathname)

抛出:NullPointerException- 如果路径名参数为空

所以File file = new File(path);抛出一个FileNotFoundException

1)如果是文件,也不例外。

2)如果不存在,它不会抛出异常。

底线,将抛出的唯一异常是NullPointerException如果路径名为空。

另一方面File.createNewFile()可以抛出一个IOException或一个SecurityExceptionFile.ListFiles()也可以抛出安全异常。

于 2012-08-07T02:16:43.173 回答
0

嗯,我不认为这是我正在寻找的方法。他们目前不抛出任何异常。但是我知道代码在这些情况下会失败,所以我想知道如何向它们添加异常,以便我可以适当地处理这些情况。

它不会抛出异常。在listFiles()文档中,它说:

如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。

所以如果它是一个文件,或者一个不存在的文件,它会返回一个空值。

但这就是 RuntimeException 发挥作用的地方如果在您编写的方法中说:

public void doStuffToAnExistingDirectory(String dirname)
{
    // stuff
}

并且该方法的编写方式是它需要一个现有目录的目录名称,并且在该方法的某个地方执行以下操作:

    File file = new File(dirname);
    File[] listFiles = file.listFiles();
    int num = listFiles.length;

这将抛出一个NullPointerExceptionifdirname不表示现有目录。此异常是Runtime,因此您不必捕获它或在您的doStuffToAnExistingDirectory()方法中声明它,您可以让它传播直到最终捕获它。这本质上是说该方法不是为了处理目录不存在的异常而编写的。因此,在该程序运行期间,如果dirname以某种方式最终成为一个不存在的目录,则会引发运行时异常。

您可以选择在您的代码中处理这种情况(而不是在运行时,当程序运行时),并检查是否listFiles为空,然后可能抛出您自己的异常以让任何调用该doStuffToAnExistingDirectory()方法知道它只是给了你一个不存在的目录。

于 2012-08-07T02:20:32.190 回答