Java try-finally构造

时间:2011-10-27 05:26:24

标签: java exception

当我们可以使用这种结构时,有人能解释一些情况(例子)吗?

try{

        //dangerous code here
    } finally {

        //always called    
    }

我真的明白它是如何运作的,但在实际情况下更新。

11 个答案:

答案 0 :(得分:3)

几乎每当你有Closeable之类的东西,你需要显式调用close()来释放底层资源时,你想把这个调用放在finally块中,像:

FileReader f = whatever();
try {
    // do some stuff with f
    return;
}
finally {
    f.close();
}

即使没有抛出异常,并且运行return块内的try,资源仍将正确关闭。

答案 1 :(得分:2)

一些常见情况:

  1. 防止资源泄漏:
    关闭IO流和数据库连接
  2. 消息记录

答案 2 :(得分:2)

您可以使用它来关闭数据库连接或任何其他资源 - 文件,硬件端口等

try{
     // Do something I care about
} finally {
    // Make sure we clean up, regardless of success or failure   
}

答案 3 :(得分:2)

以下是一个例子:

InputStream in = new FileInputStream(...);
try {
    / * use in here */
} finally {
    in.close();
}

基本上,无论发生什么,in将永远关闭。如果没有这个,in可以保持打开,直到垃圾收集器收集它(可能是时间)。这是一个问题,因为:

  • 您可以一次打开的文件/网络连接数量有限制
  • 开放式网络连接也将继续占用远程端的资源(数据库连接就是一个很好的例子)
  • 关闭输入流也会刷新它(刷新在输入流的缓冲区中写入任何内容)

答案 4 :(得分:2)

例如,当您阅读文件时:

InputStream is = new FileInputStream("...");
try {
    // do stuff
}
finally {
    is.close();
}

这样,即使出现异常,您的文件也会一直关闭。

答案 5 :(得分:2)

openFile();
try {
    int i = Integer.parseInt(someString);
    String sub = someString.substring(2);
    System.out.println(i+sub);
}
finally {
    closeFile();
}

正如您所看到的,在代码段落中可能会抛出几个异常,并且您可能不希望捕获每个异常。

也可能会抛出错误,你不应该抓住它!

以任何方式你想要在方法结束之前关闭你的文件,所以你把它放在finally块中

答案 6 :(得分:2)

看看这篇文章Java Exception Handling - Basics。这里清楚地描述了异常及其使用的位置。

答案 7 :(得分:2)

这是一种非常常见的模式:

InputStream stream = // acquire stream...

try {
  // do stuff with stream that might throw...
}
finally {
  IOUtils.closeQuietly(stream);
}

注意,IOUtils是来自Apache Commons项目的库。您应始终在finally中关闭该流。 closeQuietly会尝试关闭流时可能抛出的任何异常(这是正常的,因为您无法对其执行任何操作)。

答案 8 :(得分:2)

特别是我们可以在finally块中使用数据库连接关闭相关代码。如果程序在这种情况下抛出任何异常,则DB连接将释放。

这是JDBC.same中的示例,可以在Hibernate中的session.close()中使用。 试试{

    //dangerous code here 
} catch(Exception e){
  //Do some thing releted to your exception
} finally { 
  //close DB connection or close your hibernate session.

    //always called     
}

答案 9 :(得分:2)

好吧,假设您打开了与数据库的连接并进行了一些查询。如果其中一个查询引发SQLException,则应该在执行其他操作之前关闭连接。如果没有引发异常,你仍然应该关闭它。 因此,try {} catch () {}可以捕获那些SQLExceptions并对它们做些什么,而finally {}可以在任何一种情况下关闭连接。 这将是一种非常常见的情况,但无论在使用它时发生什么,都需要释放任何资源,情况也是如此。

答案 10 :(得分:2)

try {
    isWorking = true
    //doStuff that might or might not succeed
    } finally {
    isWorking = false;
    }

另一个例子:

public void actionPressed()
  {
    if( isLoading )
      return;
    try {
    isLoading= true;
    doTheLoad);
    } finally {
    isLoading = false;
    }    
  }