我对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");
}
答案 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
}
这就是你需要的。从我的知识来看,在方法行中引用异常会引发异常,因此您作为程序员知道该方法中正在处理的是什么。