投掷抛出的异常会被抓住?

时间:2013-08-28 06:31:28

标签: java exception

我对throws关键字有一些疑问。 我将通过我的例子来解释我。

从构造函数我调用do1()方法,从do1()方法调用do2()方法。

现在do2()可以抛出已检查的异常“FileNotFoundException”。所以我声明并将其抛给被调用的方法。 再次编译器要求我处理调用方法do2()和do2()的方法构造函数。构造函数(最后调用方法)抛出它,如果发生任何异常,如do2()中找不到文件路径,将处理异常?我们只是抛出它。我们没有抓住它。正好足以处理异常。

public Parent() throws FileNotFoundException {
        System.out.println("Super");


    do1();


}
    void do1() throws FileNotFoundException{

        do2();
    }


void do2() throws FileNotFoundException{
     FileReader f=new FileReader("C:/as");
    }

2 个答案:

答案 0 :(得分:2)

异常必须最终在某处处理,但它不必在您的Parent类中。在您的情况下,调用new Parent ()的方法可能会捕获异常,或者将其再次抛出到其调用方法。

E.g。

try {
    Parent p = new Parent ();
} catch (FileNotFoundException fnfe) {
    // Handle exception
}

或者,你可以有类似的东西:

private Parent methodCreatingParent () throws FileNotFoundException {
    return new Parent ();
}

private void someOtherMethod () {
    try {
        Parent p = methodCreatingParent ();
    } catch (FileNotFoundException fnfe) {
        // Handle exception
    }
}

当抛出异常的方法(在您的情况下为throws)没有足够的上下文信息来正确处理异常时,使用Parent ()关键字。

修改

根据@Hot Licks的评论,可以使用以下代码永远不会处理FileNotFoundException

public class TestClass {
    public static void main (String[] args) throws FileNotFoundException {
        Parent p = new Parent ();
    }
}

在这种情况下,默认异常处理程序将自动处理异常。默认处理程序打印堆栈跟踪并停止应用程序。可以通过方法Thread.setDefaultUncaughtExceptionHandler (Thread.UncaughtExceptionHandler eh)指定要使用的处理程序。

答案 1 :(得分:-2)

你需要在你的fileReader周围试试catch块。这就是你如何“抓住”你的错误。

try{
    FileReader f = new FileReader("C:/as");
}catch(FileNotFoundException e){
    //handle exception
}

这就是你需要的。从我的知识来看,在方法行中引用异常会引发异常,因此您作为程序员知道该方法中正在处理的是什么。