使用RuntimeExceptions

时间:2012-08-07 02:00:56

标签: java exception

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

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

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

    File[] listFiles = file.listFiles();

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

对不起,如果这看起来像新手问题,我仍然不知道如何使用例外。请有人澄清一下吗?

6 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

public void foo() throws FileNotFoundException

答案 2 :(得分:0)

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

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

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

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

public void someMethod() throws IOException, SecurityException { /*...*/ }

答案 3 :(得分:0)

File是虚拟概念。在Java中,File不允许存在(这就是为什么我们有File.exists())。这允许您指定“可能的”位置(例如,写入)。

它还允许检查所需文件是否存在,允许开发人员做出决定(过度写入文件,不加载文件,在锁定文件上做其他事情)

listFiles是另一个野兽。可以说,如果您尝试列出“文件”或目录不存在,它可能应该抛出某种IOException。自Java 1以来,它已经脱离了API。这表明当时的设计范式与我们用来了解的范式不同。

您可以在对Properties类的更改中看到这一点,其中save已被弃用,而store会抛出IOException

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

答案 4 :(得分:0)

首先,根据Documentation

public File(String pathname)

抛出:NullPointerException - 如果pathname参数为null

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

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

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

最重要的是,如果路径名为null,则抛出的唯一异常是NullPointerException

另一方面,File.createNewFile()可以抛出IOExceptionSecurityExceptionFile.ListFiles()也可以抛出安全例外。

答案 5 :(得分:0)

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

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

  

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

因此,如果它是文件或不存在的文件,则返回null。

here 是RuntimeException发挥作用的地方。如果用你写的方法说:

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

编写方法使期望现有目录的目录名,并在该方法的某处执行此操作:

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

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

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