首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解try-catch-finally块的工作原理时遇到麻烦

理解try-catch-finally块的工作原理时遇到麻烦
EN

Stack Overflow用户
提问于 2015-05-02 13:00:40
回答 3查看 83关注 0票数 3

如果我错了,请纠正我,但是,我相信try块中的语句首先被执行,然后,如果发生任何异常,finally块中的语句被执行,然后catch块中的语句被执行。如果没有发生异常,那么一旦执行了try块中的语句,就会执行finally块中的语句,并跳过catch块中的语句。

如果我上面的概念没有错,那么我不明白为什么这段代码不能工作:

代码语言:javascript
复制
// sock is an object of the class Socket
public void run() {
    try {
        in = sock.getInputStream();
        scan = new Scanner(in);
        out = sock.getOutputStream();
        pw = new PrintWriter(out);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        sock.close();
    }   
}

它仍然说明我需要用try-catchfinally块中的语句括起来。

EN

回答 3

Stack Overflow用户

发布于 2015-05-02 13:04:42

否!首先执行try块中的语句。然后,如果发生任何异常,则执行catch块语句。最后执行finally块。即使在try块中发生异常,也会执行finally块。换句话说,如果没有异常发生,那么首先执行try块,然后执行finally块。

票数 6
EN

Stack Overflow用户

发布于 2015-05-02 13:11:24

通常,如果您的catch块可以catch Exception thrown by try块。

代码语言:javascript
复制
try -> finally (If No Exception)
try -> catch -> finally (If Exception)
票数 4
EN

Stack Overflow用户

发布于 2015-05-02 13:03:45

每当遇到异常(可以由列出的catch块捕获)时,就会执行catch块中的语句。无论try块中是否抛出异常,finally块中的语句都将始终被执行。

您的sock.close();语句可能会抛出一个IOException,因此您要么应该让另一个try-catch块包装内部的try-catch块,要么将一个throws声明添加到run()方法中(并且该方法的调用者可以在调用周围包含一个try-catch块)。

编辑(根据注释):首先执行catch中的语句,然后执行finally中的语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29998600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档