Java 为什么是“a”;最后";此代码中需要的块

Java 为什么是“a”;最后";此代码中需要的块,java,try-catch-finally,Java,Try Catch Finally,我知道,创建一个try-catch段而不使用 最后一个街区。所以在用这些代码进行黑客攻击时,我不明白 是什么java逻辑(例如规则、理论)迫使我包含finally块 在这段代码中-以及为什么finally块必须包含一个return 其中的声明。换句话说,如果我最终删除 如果完全阻塞,我将收到一个错误,如果替换return语句 在finally块中,使用任何其他内容(例如System.out.printl(“foo”)),I 仍然收到一个错误,坚持要求我包含一个返回语句。再次, 这里写的代码编译和

我知道,创建一个try-catch段而不使用 最后一个街区。所以在用这些代码进行黑客攻击时,我不明白 是什么java逻辑(例如规则、理论)迫使我包含finally块 在这段代码中-以及为什么finally块必须包含一个return 其中的声明。换句话说,如果我最终删除 如果完全阻塞,我将收到一个错误,如果替换return语句 在finally块中,使用任何其他内容(例如System.out.printl(“foo”)),I 仍然收到一个错误,坚持要求我包含一个返回语句。再次, 这里写的代码编译和运行都很好。我只是想理解一下 试捕最终构造背后的一点理论(p.s.我理解 这都是关于“异常处理”…但我的问题实际上更多的是关于 代码流和返回语句)


最后考虑没有
的执行路径

int getInt() {
    try {
        String[] students = {"student1", "student2"};
        System.out.println(students[4]);
        // no return
    }
    catch (Exception e) {
        return 10; // if an exception occurs 
    }
    // no return
}
那么,如果没有抛出异常会发生什么呢?您将没有返回值

您可以提供一个
finally
并在那里放置一个返回,也可以在
try catch
块之外放置一个返回

请注意,
try catch finally
块中的
finally
具有一个
return
语句,该语句将取代
catch
return
语句,因为如果执行与其关联的
try[-catch]
块,则始终会执行
finally

int getInt() {
    try {
        String[] students = {"student1", "student2"};
        System.out.println(students[4]);
        // the return could be here as well
    }
    catch (Exception e) {
        return 10; // in case of failure
    }
    return 20; // in case of success
}

所有执行路径必须返回一个值(或引发异常)。

最后考虑没有
的执行路径

int getInt() {
    try {
        String[] students = {"student1", "student2"};
        System.out.println(students[4]);
        // no return
    }
    catch (Exception e) {
        return 10; // if an exception occurs 
    }
    // no return
}
那么,如果没有抛出异常会发生什么呢?您将没有返回值

您可以提供一个
finally
并在那里放置一个返回,也可以在
try catch
块之外放置一个返回

请注意,
try catch finally
块中的
finally
具有一个
return
语句,该语句将取代
catch
return
语句,因为如果执行与其关联的
try[-catch]
块,则始终会执行
finally

int getInt() {
    try {
        String[] students = {"student1", "student2"};
        System.out.println(students[4]);
        // the return could be here as well
    }
    catch (Exception e) {
        return 10; // in case of failure
    }
    return 20; // in case of success
}


所有执行路径必须以返回值(或引发异常)结束.

诀窍是读取错误消息。如果没有finally block,如果没有异常,该方法返回什么?返回20
也可以在try/catch之外,在方法的末尾,或者在
try
块的末尾。但是,上面的操作没有错。拥有
finally
block修复了编译,但从逻辑上讲,这是一个错误。(我的首选是在方法的末尾。或者在那里放置一条注释,指出
返回的位置。
)有人向您提出了一个难题。finally块中的
20
(将在catch块之后执行)是否替换
10
?[提示:是]
return
在finally块中是合法的,但这是一个坏主意。诀窍是读取错误消息。如果没有finally块,如果没有异常,该方法返回什么?返回20也可能在try/catch之外,在方法的末尾,或者在
try
块的末尾。没有任何错误但是,上面是如何完成的。使用
最终
块修复编译,但从逻辑上讲,这是一个错误。(我的首选是在方法的末尾。或者在那里放置一条注释,指示假定
返回
的位置。)有人向你提出了一个难题。finally块中的
20
(将在catch块之后执行)是否替换finally块中的
10
?[提示:是]
return
合法,但这不是一个好主意。或者在try块的末尾放一个return(对我来说是最自然的位置)因此,如果发生错误,则最终块不会执行,因为catch块已返回值。这是否正确?@bbalchev:否。最终块始终会执行。这就是最终块的全部要点。好的,谢谢。从棘手的问题中学习总是很好的。@vee您指的是第一个代码段吗?注意我是如何t说“考虑没有
finally
的执行路径”。它不是用来编译的。它说明了如果没有
finally
(或其他
return
语句)它为什么会失败。或者在try块的末尾放一个return(对我来说最自然的地方)因此,如果发生错误,则最终块不会执行,因为catch块已返回值。这是否正确?@bbalchev:否。最终块始终会执行。这就是最终块的全部要点。好的,谢谢。从棘手的问题中学习总是很好的。@vee您指的是第一个代码段吗?注意我是如何t表示“考虑没有
finally
的执行路径”。它不是为了编译。它说明了如果没有
finally
(或其他
return
语句)它为什么会失败。