繁体   English   中英

Java尝试最终构建

[英]Java try-finally construction

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

try{

        //dangerous code here
    } finally {

        //always called    
    }

我真的很了解它是如何工作的,但是在实际情况下会更新使用。

几乎在任何时候都有Closeable类的Closeable ,您需要显式调用close()释放基础资源时,都希望将该调用放在finally块中,例如:

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

即使未引发异常,并且运行try块内部的return ,资源仍将正确关闭。

一些常见方案:

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

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

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

这是一个例子:

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

基本上,无论发生什么情况, in都将始终处于关闭状态。 没有这个, in可能会保持打开状态,直到垃圾收集器将其收集起来(可能会很长一段时间)。 这是一个问题,因为:

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

例如,当您读取文件时:

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

这样,即使有异常,文件也始终关闭。

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

如您所见,在代码传递过程中可能会引发多个异常,并且您可能不想捕获每个异常。

也可能会引发错误,您不应该捕获该错误!

在方法结束之前,以任何方式要关闭文件,因此将其放在finally块中

请参阅本文Java异常处理-基础 这里清楚地描述了异常及其使用位置。

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

InputStream stream = // acquire stream...

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

注意, IOUtils是Apache Commons项目中的一个库。 您应该始终在finally关闭流。 closeQuietly会尝试关闭流时吃掉任何可能抛出的异常(这是可以的,因为您对此无能为力)。

特别是我们可以在final块中用于数据库连接关闭相关代码。 如果程序在这种情况下引发任何异常,则将断开数据库连接。

这是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     
}

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

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;
    }    
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM