如果我错了,请纠正我,但是,我相信try块中的语句首先被执行,然后,如果发生任何异常,finally块中的语句被执行,然后catch块中的语句被执行。如果没有发生异常,那么一旦执行了try块中的语句,就会执行finally块中的语句,并跳过catch块中的语句。
如果我上面的概念没有错,那么我不明白为什么这段代码不能工作:
// 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-catch将finally块中的语句括起来。
发布于 2015-05-02 13:04:42
否!首先执行try块中的语句。然后,如果发生任何异常,则执行catch块语句。最后执行finally块。即使在try块中发生异常,也会执行finally块。换句话说,如果没有异常发生,那么首先执行try块,然后执行finally块。
发布于 2015-05-02 13:11:24
通常,如果您的catch块可以catch Exception thrown by try块。
try -> finally (If No Exception)
try -> catch -> finally (If Exception)发布于 2015-05-02 13:03:45
每当遇到异常(可以由列出的catch块捕获)时,就会执行catch块中的语句。无论try块中是否抛出异常,finally块中的语句都将始终被执行。
您的sock.close();语句可能会抛出一个IOException,因此您要么应该让另一个try-catch块包装内部的try-catch块,要么将一个throws声明添加到run()方法中(并且该方法的调用者可以在调用周围包含一个try-catch块)。
编辑(根据注释):首先执行catch中的语句,然后执行finally中的语句。
https://stackoverflow.com/questions/29998600
复制相似问题