Java 何时抛出FileNotFoundException
我在Java 何时抛出FileNotFoundException,java,Java,我在main方法中调用了名为readFile()的方法,readFile()抛出FileNotFoundException,但main没有,如下所示: public static void main(String[] args){ readFile(); } public static void readFile() throws FileNotFoundException{ Scanner input = new Scanner(new File("file.txt"));
main
方法中调用了名为readFile()
的方法,readFile()
抛出FileNotFoundException,但main
没有,如下所示:
public static void main(String[] args){
readFile();
}
public static void readFile() throws FileNotFoundException{
Scanner input = new Scanner(new File("file.txt"));
...
}
编译程序时,我在
main
方法中的readFile()
处出错。似乎我还需要在main
的头中抛出一个异常。为什么我需要在main
和readFile()
的两个头中都抛出异常?在main方法中抛出异常没有意义-这是程序的入口点,这意味着没有其他方法会捕捉并处理此异常。您应该在此处捕获并处理异常-要么记录错误,给用户一条清晰的消息,读取其他文件,但在此处引发异常是错误的。您需要捕获异常
public static void main(String[] args){
readFile();
}
public static void readFile() {
try {
Scanner input = new Scanner(new File("file.txt"));
...
} catch (FileNotFoundException ex) {
// Error message
} catch (Exception ex) {
// Incase a different exception is caught
}
}
将
抛出关键字视为承诺;您的意思是您现在不会捕获异常,但是您将在调用语句中捕获它
您当前在readFile
方法中的代码似乎完全有效,但是您需要将调用语句包装在try catch
中,以适当地处理异常。处理异常的选项是捕获异常并立即处理它们,或者将它们抛出函数中,并将异常传播给函数的调用方
对于main
,有必要捕获catch
并在那里处理异常
public static void main(String[] args){
try {
readFile();
} catch (FileNotFoundException e) {
// Do something with `e`
}
}
public static void readFile() throws FileNotFoundException {
Scanner input = new Scanner(new File("file.txt"));
// ...
}
但是,您也可以这样做:
public static void main(String[] args){
readFile();
}
public static void readFile() {
try {
Scanner input = new Scanner(new File("file.txt"));
// ...
} catch (FileNotFoundException e) {
// Do something with `e` or handle it accordingly.
}
}
我建议不要在main
中抛出异常,但在这之后,真正的问题是如果某个东西失败,是否有“备份”。如需了解更多信息,请参阅本文的精彩细节。Java对其异常存在一些争议。它有两类例外。检查和取消检查。从RuntimeException或Error扩展而来的任何异常都是未选中的,不需要在方法签名中捕获或显式声明为throwable
然而,FileNotFound是一个已检查的异常,必须在方法签名中捕获或声明为throwable
基本思想是,选中的异常是您可以从中恢复的异常,而未选中的异常则是来自编程中最有可能出现的不可恢复错误的异常
您可以在此处阅读所有相关内容:您需要捕获它,而不是抛出它。您希望通过传播此异常实现什么?因为main调用readFile,如果readFile抛出FileNotFound异常,则main将在未捕获该异常时传播该异常。所以你要么在main中捕获异常,要么声明它可以抛出异常,尽管是间接的。我认为你把人们和“为什么我需要抛出异常”混淆了:我认为你的意思是“为什么我需要声明main可以抛出异常”如果其他Java类调用main
,会怎么样?@MadProgrammer-那么这是糟糕的编程,不应该这样做(IMHO)。main是一个入口点,不应该被称为internallyNone,越少越好,它就完成了,仅仅因为我们认为它是一个坏的东西并不能阻止它的发生,事实上,它可能是通过设计完成的。您可以从main
抛出异常,JVM将处理它(就像处理未捕获的异常一样),但这需要更多细节;)-我个人倾向于用main
方法处理它,但这并不总是可能的