Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java try/catch/finally块中的执行顺序以及try块中的复合返回语句_Java - Fatal编程技术网

Java try/catch/finally块中的执行顺序以及try块中的复合返回语句

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

因此,我遇到了这段代码,想知道复合返回语句是否会失败,因为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块,关闭提取器,然后使用关闭的提取器执行复合返回语句,这将导致错误

问题:复合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
块内部返回,可能会发生的反直觉行为。