try / catch / finally块中的执行顺序,try块中有复合return语句

时间:2019-04-25 01:17:31

标签: java

因此,我遇到了这段代码,想知道复合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中尝试执行操作?

2 个答案:

答案 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块中修改了该值,则方法将始终返回新值。