如果我错了,请纠正我,但是,我相信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();
}
}
它仍然说我需要使用finally
将try-catch
块中的语句括起来。
答案 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
中的语句。