“finally”和“catch”之后的写法有什么区别?
例如:
public boolean example() {
try {
// Code
} catch (RuntimeException e) {
// Code
} finally {
return true;
}
}
public boolean example() {
try {
// Code
} catch (RuntimeException e) {
// Code
}
return true;
}
答案 0 :(得分:7)
首先,唯一可以被视为候选人的成语是:
try {
// stuff
} catch (Throwable t) {
// handle
}
// finally stuff
注意捕获的类型。只有当你发现任何可能的异常时,包括ThreadDeath
和VirtualMachineError
这样的黑暗怪物,你才能无条件地到达try-catch下方的代码。
但是,这只是它开始的地方。如果处理代码本身抛出异常怎么办?所以你至少需要
try {
// main stuff
} catch (Throwable t) {
try {
// handle
} catch (Throwable t) {
// no code allowed here! Otherwise we descend into
// infinite recursion
}
}
// finally stuff
现在你可能已经开始意识到finally
的好处,但并非全部。考虑一个非常典型的场景:
try {
// main stuff, may throw an exception. I want the exception to
// break what I'm doing here and propagate to the caller.
return true;
} finally {
// clean up, even if about to propagate the exception
}
你怎么改写这个?没有代码重复,不可能。
答案 1 :(得分:3)
在您提供的代码中没有区别。但最终用于在try块之后运行一些代码,无论是否存在异常。
这里有趣的一点是,我们应该避免从finally块返回,因为当我们从try块返回一些东西时它会在scenarion中造成混乱。考虑一下这段代码:
try {
return true;
}
finally {
return false;
}
现在,无论try中发生什么,此代码都将返回false。在许多方面,这种行为与最终意味着什么的口语理解完全一致 - “无论事先在try块中发生什么,总是运行此代码。”因此,如果从finally块返回true,则整体效果必须始终为true,不是吗?
一般来说,这很少是一个好习惯,你最后应该使用 大量禁止清理/关闭资源,但很少,如果有的话 从它们返回一个值。
答案 2 :(得分:2)
您的情况没有区别。但
运行时系统始终执行finally block内的语句,而不管try块中发生了什么。
所以这是进行清理的理想场所。
请注意,如果您使用的是JDK 7+,那么只需使用try-with-resources statement即可消除finally块的大部分用途。
答案 3 :(得分:1)
我们使用try block,catch block和finally块来处理我们程序中的Exception。程序可能具有检查或未选中的异常。所以这个块用于处理那些异常。在try块中,我们提到或编写可能导致Exception的代码,如果我们希望在发生Exception时运行我们的代码然后我们在catch块中编写这些代码。最后是一个非常特殊的块,它给了我们一个特殊的功能,如果我们的catch块没有运行,那么在程序进行终止之前,最后块代码肯定会执行。这主要用于在不需要的程序终止期间保存我们的数据。如果我们使用try块,那么在try块之后必须有一个catch块,但最后是一个可选的非强制性的。
答案 4 :(得分:0)
在这个问题中首先要理解的是“为什么我们使用try {} catch {}阻止”Ok。
答案是,当我们的代码有可能抛出异常时。
这些代码我们放入try {...} block& catch {...}块包含用于捕获try {}块中代码生成的异常的代码。
最后{...}块包含try {} catch {}块后立即执行的代码,当try {} block抛出异常时。
例如,当你访问某个网站时,但是对某些服务器端问题却无法和页面显示某种消息,如“404错误或服务器正在更新”,这些代码写在finally块中。答案 5 :(得分:0)
这个简单的catch只用于catch eXception并处理它,但最后,如果是Exception则执行,例如对于紧密连接。
答案 6 :(得分:0)
最后一个块对于清理代码很有用,比如关闭开放流。
E.g:
File f = new File("\file.txt");
FileStream fs;
try{
fs = new FileStream(f);
} catch (IOException ioe){
ioe.printStackTrace();
} finally {
if (fs != null) {
fs.close() // close the stream
}
}
答案 7 :(得分:0)
由于您的代码只返回true/false
,因此它不会受到太大影响。但请考虑编写一些强制/清理代码来执行的任何其他代码/逻辑。
此外,很难通过我们的代码捕获所有异常,换句话说,我们应该捕获我们可以处理的特定异常。此时,finally
将成为真正的救星,因为它将始终执行(除了System.exit()
或在一些递归情况下)。
另外,为了使代码具有一致性,应始终使用finally
块来执行任何清理代码。
您也可以参考以下帖子以获得更多说明:
答案 8 :(得分:0)
第一种情况:
如果在try块中发生异常,那么将执行catch块,并且如果再次发生异常则提供相同的catch块,则finally块将执行。
第二种情况:
如果try块中发生异常,则执行catch块,如果同一catch块中还有异常,则返回true;会执行。
答案 9 :(得分:-2)
finally() 但是如果你在catch之后编写代码行,如果发生异常就不会执行..