在每个方法中添加throws签名

时间:2014-12-08 18:20:07

标签: java exception throws

我第一次处理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

我想知道我做错了。在一个更复杂的项目中,你需要捕获更多的异常,它会变得非常混乱。这是处理异常的更好做法吗?为什么我需要在两种方法中声明它?

3 个答案:

答案 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来完成。