在java中,有没有办法确保在finally块中调用多个方法?

前端之家收集整理的这篇文章主要介绍了在java中,有没有办法确保在finally块中调用多个方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

所以我有一个try / finally块.我需要在finally块中执行许多方法.但是,这些方法中的每一个都可以抛出异常.有没有办法确保在没有嵌套的finally块的情况下调用(或尝试)所有这些方法

这就是我现在所做的,这非常难看:

  1. protected void verifyTable() throws IOException {
  2. Configuration configuration = HBaseConfiguration.create();
  3. HTable hTable = null;
  4. try {
  5. hTable = new HTable(configuration,segmentMatchTableName);
  6. //...
  7. //varIoUs business logic here
  8. //...
  9. } finally {
  10. try {
  11. try {
  12. if(hTable!=null) {
  13. hTable.close(); //This can throw an IOException
  14. }
  15. } finally {
  16. try {
  17. generalTableHelper.deleteTable(configuration,segmentMatchTableName); //This can throw an IOException
  18. } finally {
  19. try {
  20. generalTableHelper.deleteTable(configuration,wordMatchTableName); //This can throw an IOException
  21. } finally {
  22. generalTableHelper.deleteTable(configuration,haplotypeTableName); //This can throw an IOException
  23. }
  24. }
  25. }
  26. } finally {
  27. HConnectionManager.deleteConnection(configuration,true); //This can throw an IOException
  28. }
  29. }
  30. }

有更优雅的方式吗?

最佳答案
Java中正确的资源管理的标准(工作)方式(该原则也适用于其他语言)是:

  1. Resource resource = acquire(resource);
  2. try {
  3. use(resource);
  4. } finally {
  5. resource.release();
  6. }

或者在当前版本的Java SE中使用快捷方式(带有一点点聪明):

  1. try (Resource resource = acquire(resource)) {
  2. use(resource);
  3. }

(正如Joe K指出的那样,您可能需要包装资源以使其确认Java语言所依赖的特定接口.)

两个资源,您只需应用两次成语:

  1. Resource resource = acquire(resource);
  2. try {
  3. SubResource sub = resource.acquire();
  4. try {
  5. use(sub);
  6. } finally {
  7. sub.release();
  8. }
  9. } finally {
  10. resource.release();
  11. }

在Java SE 7中:

  1. try (
  2. Resource resource = acquire(resource);
  3. SubResource sub = resource.acquire()
  4. ) {
  5. use(resource,sub);
  6. }

新语言功能的真正优势在于,在写出时,资源处理往往不会被破坏.

您可能有更复杂的异常处理.例如,您不希望将低级别异常(例如IOException)抛出到正确的应用程序中 – 您可能希望包装一些RuntimeException子类型.使用Execute Around惯用法(参见this excellent question),可以使用Java的典型冗长来解决这个问题.从Java SE 8开始,语法也会缩短,语义也会随机变化.

  1. with(new ResourceSubAction() { public void use(Resource resource,SubResource sub) {
  2. ... use resource,sub ...
  3. }});

猜你在找的Java相关文章