我第一次处理Java中的异常,我想知道这是否是一个好方法。
public static void main(String[] args) throws FileNotFoundException {
submethod();
}
static void submethod() throws FileNotFoundException {
Scanner scan = new Scanner(new File("file.txt"));
while (scan.hasNextLine()) {
// do somethig...
}
}
对我来说听起来很奇怪的是throws FileNotFoundException
方法中的显式声明main
,否则编译器报告:
error: unreported exception FileNotFoundException; must be caught or declared to be thrown
我想知道我做错了。在一个更复杂的项目中,你需要捕获更多的异常,它会变得非常混乱。这是处理异常的更好做法吗?为什么我需要在两种方法中声明它?
答案 0 :(得分:2)
需要在FileNotFoundException
子句中指定throws
,因为FileNotFoundException
是已检查的例外。另一种选择是捕获异常并使用try-catch
处理它。
由您的程序要求决定如何处理异常。例如,如果要在抛出异常时打印某个错误消息,则可以捕获它:
try {
Scanner scan = new Scanner(new File("file.txt"));
while (scan.hasNextLine()) {
// do somethig...
}
} catch(FileNotFoundException ex) {
System.err.println("file.txt was not found");
}
但是,在一个简单的情况下,就像你所拥有的那样,在发生异常时终止程序是有意义的。因此,您可以像刚才那样声明抛出异常的方法。
在更复杂的场景中,您可能希望捕获异常,向用户打印内容并继续执行该程序。例如,如果submethod
仅用于读取用户提供的文件,则可以保持throws
不变。但是,方法的调用者可能希望在抛出异常时处理异常,并且可能要求用户重新输入另一个文件名。
答案 1 :(得分:0)
你不应该像这样处理它。您应该在某处捕获错误并处理异常。您应该捕获submethod()中的错误或者在main方法中捕获它并处理异常。你现在拥有它的方式没有错误处理只是将错误抛出堆栈。例如:
static void submethod() {
try
{
Scanner scan = new Scanner(new File("file.txt"));
while (scan.hasNextLine()) {
// do somethig...
}
}catch(FileNotFoundException e)
{
e.printStackTrace();
//error handling here
}
}
或者:
public static void main(String[] args) {
try
{
submethod();
}catch(FileNotFoundException e)
{
e.printStackTrace();
//error handling code here
}
}
在第二种情况下,你会在你的submethod()中抛出FileNotFoundException。你会把抛出声明留在你的子方法中,但不是你在那里处理它的主要方法。
答案 2 :(得分:0)
因为你的submethod()没有处理FileNotFoundExceptionm异常。该方法的调用者需要处理此异常,这可以通过将方法调用包含在try catch块中或通过向main方法添加throws来完成。