我有一个问题,关于在使用另一个可能引发异常的方法的方法中捕获异常。
public void methodA(File file) {
try {
}
catch (IOException ex) {
}
}
public void methodB() {
// do something with the file
File file = new File("/example.txt");
methodA(file);
}
我需要在methodB内创建一个try and catch块吗?还是足以在方法A中捕获IOException的异常?
答案 0 :(得分:2)
这取决于您想要实现的目标。
在您的代码示例中,methodA将处理异常并继续执行methodB而不会中断。这可能不是您想要的,因为读取文件时出错,应该妥善处理。
您最有可能希望将异常冒泡到执行链上并在相关对象中进行处理(例如,某些错误处理程序可以将错误消息输出给用户)。
像这样冒充您的异常:
public void methodA(File file) throws CustomUserInputException {
try {
}
catch (IOException ex) {
throw new CustomUserInputException(ex, "Error opening file" + file.getPath());
}
}
然后在这样的适当对象中处理它:
public void methodB() {
// do something with the file
File file = new File("/example.txt");
try {
methodA(file);
}
catch (CustomUserInputException ex) {
showErrorToAnUser();
stopStandardProgramExecution();
}
}
答案 1 :(得分:1)
否,在这种情况下,您不需要在methodB中-但您可能想要这样做,因为methodA可能会在IOException旁边引发其他错误。
这取决于您的意图和异常的类型-如果您的methodA抛出了一个已检查的异常,methodB必须捕获它或声明它抛出了该异常。如果它是RuntimeException,则methodB可能会捕获它或将其忽略。 在大多数技术堆栈中,检查异常很少见,大多数人认为这是一次失败的实验。
最后,一个方法是否需要捕获异常取决于-methodB可以想像地处理错误吗?如果是这样,抓住它-如果不是,让它冒泡,例如到一般的错误处理程序,甚至使程序崩溃。没有什么比捕获每个错误并做错事的程序更令人讨厌了。
答案 2 :(得分:-1)
您不能这样做,因为异常只能在调用堆栈上移动。如果程序还在异常之后运行方法,那么即使首先创建异常又有什么意义呢?
尝试处理发生异常的地方。如果在创建File
时可能出现异常,则应在创建文件的地方对其进行处理。否则,确保传入值不是异常的开销将太高。
我建议要么将其捕获在methodB
中,要么将文件名传递到methodA
中,然后让它创建File
并捕获所有异常。