据我所知,以下两个代码段将达到相同的目的。为什么要finally
块呢?
代码A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
代码B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
据我所知,以下两个代码段将达到相同的目的。为什么要finally
块呢?
代码A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
代码B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Answers:
Throwable
...)一个代码finally
块确保无论您退出该代码块(以几种方式明确地中止整个过程),该代码块都将被执行。这对于确定性清除资源很重要。
System.exit()
调用(2)在try或catch块之一中存在无限循环,则最终将不会执行(3)我拔下计算机的插头
无论try或catch块中发生了什么,您都可能希望将想要添加的代码都执行。
同样,如果您正在使用多个catch,并且要放置所有catch块共有的代码,则可以放置该代码,但是您不能确保try中的整个代码都已执行。
例如:
conn c1 = new connection();
try {
c1.dosomething();
} catch (ExceptionA exa) {
handleexA();
//c1.close();
} catch (ExceptionB exb) {
handleexB();
//c1.close();
} finally {
c1.close();
}
最终总是执行,因为捕获之后的代码可能不会执行。
finally
除非关闭JVM,否则始终执行,finally
只是提供了一种将清除代码放在一个地方的方法。
如果您必须在每个catch
块中放入清理代码,那将太繁琐。
如果catch块抛出任何异常,则将不执行其余代码,因此我们必须编写finaly块。
仍在向下滚动?干得好!
这个问题使我有些困难。
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
在上述情况下将打印什么?是的,猜对了:
ex.Message-无论是什么(可能尝试除以零)
最后块
终于经过
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
这将打印什么?没有!由于catch块引发了错误,因此引发了错误。
在良好的编程结构中,可以从另一层处理该代码,从而可以对您的异常进行处理。为了激发这种情况,我将嵌套此代码。
try
{
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block")
}
console.writeline("After finally");
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
在这种情况下,输出为:
显然,当您捕获异常并将其再次抛出到其他层(漏斗)时,抛出后的代码将不会执行。它的行为类似于函数内部返回的工作方式。
现在您知道了为什么不在catch块之后关闭代码上的资源。将它们放在finally块中。