Java try/catch/finally块中的执行顺序以及try块中的复合返回语句
因此,我遇到了这段代码,想知道复合返回语句是否会失败,因为finally块是在返回语句执行之前执行的:Java try/catch/finally块中的执行顺序以及try块中的复合返回语句,java,Java,因此,我遇到了这段代码,想知道复合返回语句是否会失败,因为finally块是在返回语句执行之前执行的: public DataObject processor(LinkedHashMap itemList) { Extractor ex = DataExtractor.getExtractor(); try{ ex.open(); return ex.processData(itemList); }catch(Exception e
public DataObject processor(LinkedHashMap itemList)
{
Extractor ex = DataExtractor.getExtractor();
try{
ex.open();
return ex.processData(itemList);
}catch(Exception e){
/* error code */
}finally{
if(ex.isOpen()) ex.close();
}
}
我的目标是执行finally块,关闭提取器,然后使用关闭的提取器执行复合返回语句,这将导致错误
问题:复合return语句是在finally块执行之前还是之后执行的,导致尝试使用关闭的提取器执行操作
复合返回语句是在finally块执行之前还是之后执行的
答案是两者都是
- 假设在该点之前没有得到异常,
ex.processData(itemList)代码>在
块之前计算最后
- 实际的
在返回
块之后执行最终
实现这一点的首选方法如下所示:
try (Extractor ex = DataExtractor.getExtractor().open()) {
return ex.processData(itemList);
} catch(SpecificException e) {
/* error code */
}
在参考资料中使用Java7+try,并让它负责关闭提取器
。并且(在大多数情况下)不捕获异常
private static int getInt() {
int i = 0;
try(FileInputStream in = new FileInputStream("FILE_PATH")) {
i = 1;
return i;
} catch (Exception e) {
e.printStackTrace();
} finally {
i = 10;
return i;
}
}
public static void main(String[] args) {
System.out.println(getInt()); // print 10 rather than 1
}
方法只返回一次,并且顺序是固定的,所有位于方法堆栈中的操作变量,return语句将在堆栈中获取值,然后返回它,因此如果修改finally块中的值,方法将始终返回新值。finally块将始终最后运行我认为
ex.processData(itemList)首先执行
,保存返回值,然后执行最后子句,然后使用保存的值执行返回代码>与对象f=foo()没有区别;返回f@markspace如果您在try块中返回变量名,那么如果您在finally块中修改并返回变量名,那么最终您将得到修改后的名称,因此您是对的。上面的代码给出警告finally块不能正常完成
,因为它不希望从finally块返回@Chanchal-Correct。本例中的代码/方法不应在实际应用程序中使用。但这里的要点是说明如果您从finally
块内部返回,可能会发生的反直觉行为。