理解try-catch-finally块的工作有困难

时间:2015-05-02 05:00:40

标签: java

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

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

// 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();
    }   
}

它仍然说我需要使用finallytry-catch块中的语句括起来。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

general 如果catch阻止catch阻止Exception阻止thrown try阻止try -> finally (If No Exception) try -> catch -> finally (If Exception) 阻止。{/ p>

Uncaught TypeError:
Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value 
is not of type '(HTMLImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap)

答案 2 :(得分:0)

只要遇到异常(可以通过列出的catch块捕获),就会执行catch块中的语句。无论是否在finally块内抛出异常,try块内的语句都将始终执行。

您的sock.close();语句可能会抛出IOException,因此您应该有另一个try-catch块包装内部try-catch或向运行中添加throws声明()方法(并且方法的调用者可以在调用周围使用try-catch块。)

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