我刚学会了如何使用异常,而且我对RuntimeExceptions有点困惑,因为这些特别是未选中。所以我有这个代码:
String path = "foo/bar/local/stuff.txt";
File file = new File(path);
如果找不到该路径,这不是FileNotFoundException吗?如何在我的方法中指定?在这一步之后我做了:
File[] listFiles = file.listFiles();
如果出现以下情况,则不会引发异常:
1.它不是目录,而是文件。
2.它不存在。
对不起,如果这看起来像新手问题,我仍然不知道如何使用例外。请有人澄清一下吗?
答案 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,但就是这样。如果文件不是目录或不存在,则该方法只返回null,因此在使用列出的文件之前应该对其进行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()
可以抛出IOException
或SecurityException
。 File.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()
方法。