因此,我遇到了这段代码,想知道复合return语句是否会失败,因为在执行return语句之前执行了finally块:
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块,关闭了Extractor,然后使用封闭的Extractor执行了复合return语句,这将导致错误。
问题:复合return语句是在执行finally块之前还是之后执行,从而导致在封闭的Extractor中尝试执行操作?
答案 0 :(得分:3)
复合return语句是在执行finally块之前还是之后执行的?
答案是都是。
假设在此之前您没有遇到异常,那么ex.processData(itemList);
在finally
块之前 进行评估。
实际的return
是在finally
程序段之后 执行的。
...导致在关闭的Extractor上尝试执行操作?
那不会发生。
实现此目标的首选方法如下:
try (Extractor ex = DataExtractor.getExtractor().open()) {
return ex.processData(itemList);
} catch(SpecificException e) {
/* error code */
}
使用Java 7+资源进行尝试,并让其负责关闭Extractor
。而且(在大多数情况下)不要抓住Exception
。
答案 1 :(得分:0)
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块中修改了该值,则方法将始终返回新值。