我在readFile()
方法中调用了一个名为main
的方法,readFile()
抛出FileNotFoundException但main
没有,如下所示:
public static void main(String[] args){
readFile();
}
public static void readFile() throws FileNotFoundException{
Scanner input = new Scanner(new File("file.txt"));
...
}
编译程序时,我在readFile()
方法的main
处出错。似乎我还需要在main
的标题中抛出异常。为什么我需要在main
和readFile()
的两个标头中抛出异常?
答案 0 :(得分:8)
Java对其例外有一些争议。它有两类例外。选中并取消选中。从RuntimeException或Error扩展的任何异常都是未选中的,不需要在方法签名中捕获或显式声明为throwable。
然而,FileNotFound是一个经过检查的异常,必须在方法签名中被捕获或声明为throwable。
基本思想是,已检查的异常是您可以从中恢复的异常,而未经检查的异常是来自编程中最可能无法恢复的异常的异常。
您可以在此处阅读所有相关信息:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
答案 1 :(得分:5)
将throws
关键字视为承诺;你现在说你现在不会抓住异常,但你会在调用声明中抓住它。
您readFile
方法中当前的代码似乎完全有效,但您需要将调用语句包装在try-catch
中以正确处理异常。
答案 2 :(得分:3)
处理Exceptions
的选项是捕获它们并立即处理它们或将它们放入函数中并将异常传播到函数的调用者。
对于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
中抛出异常,但在此之后,这真的是你是否有"备份"如果某事失败了有关详细信息,this question有非常详细的信息。
答案 3 :(得分:1)
没有必要在main方法中抛出异常 - 这是程序的入口点,这意味着没有其他方法可以捕获此异常并处理它。你应该在这里捕获和处理异常 - 记录错误,给用户一个明确的消息,读一些其他文件,无论如何,但抛出异常是错误的。
答案 4 :(得分:1)
您需要捕获异常
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
}
}