为什么我们最后使用块?

据我所知,以下两个代码片段将用于相同的目的。 为什么finally阻止?

代码A:

 try { /* Some code */ } catch { /* Exception handling code */ } finally { /* Cleanup code */ } 

代码B:

 try { /* Some code */ } catch { /* Exception handling code */ } // Cleanup code 
  • 如果你不处理的exception被抛出,会发生什么? (我希望你不会抓到Throwable …)
  • 如果你从try块内返回,会发生什么?
  • 如果catch块引发exception会发生什么?

一个finally块可以确保你退出这个块(以几种方式显式地中止整个过程),它会被执行。 这对确定性清理资源非常重要。

请注意(至less在Java中,也可能在C#中)也可以有一个try块,没有catch ,但有一个finally 。 当try块中发生exception时, finally块中的代码会在exception处于较高位置之前运行:

 InputStream in = new FileInputStream("somefile.xyz"); try { somethingThatMightThrowAnException(); } finally { // cleanup here in.close(); } 

无论在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(); } 

最后总是得到执行,你的代码在catch之后可能不会。

即使我们的应用程序被强制closures,也会有一些我们必须执行的任务(如内存释放,closures数据库,释放锁等),如果在finally块中写入这些代码行,它将执行是否抛出exception或不…

你的应用程序可能是一个线程的集合, Exception终止线程,但不是整个应用程序,在这种情况下finally更有用。

在某些情况下, finally不会执行诸如JVM失败,线程终止等。

因为您需要执行该代码,而不pipe可能引发的任何exception。 例如,您可能需要清理一些非托pipe资源(“使用”构造编译为try / finally块)。

不pipe怎样,有时候你想执行一段代码。 是否抛出exception 然后一个finally使用。

finally总是执行,除非JVM被closures, finally只是提供一个方法把清理代码放在一个地方。

如果你不得不把清理代码放在每个catch块中,那就太乏味了。

如果catch块抛出任何exception,那么剩余的代码将不会执行,因此我们必须写finaly块。