Java7,AutoClosable

简介:

Java 7的try-with-resource语法的目的是提高Java开发人员的效率,使得他们不需要在编写代码时考虑资源释放问题,大多数的这类"清理"问题是由于异常发生时清理方法没有被调用产生。

准备

  • 3个异常:
class OpenException extends  Exception{} class SwingException extends  Exception{} class CloseException extends Exception{}
  • OpenDoor类

构造函数会抛出OpenException,swing()方法会抛出SwingException,close方法会抛出CloseException。

class OpenDoor implements  AutoCloseable { public OpenDoor() throws  Exception { System.out.println("The door is open." ); //throw new OpenException()  }; public void swing() throws  Exception { System.out.println("The door is becoming unhinged." ); //throw new SwingException();  public void close() throws  Exception { System.out.println("The door is closed." ); // throw new CloseException();
  }
}
  • 可执行的TryWithResources类
复制代码
public class  TryWithResources { public static void main(String[] args) throws  Exception { try ( OpenDoor door = new  OpenDoor() ) { door.swing(); } catch  (Exception e) { System.out.println("Is there a draft? " + e.getClass());//注意e.getClass()  finally  { System.out.println("I'm putting a sweater on, regardless. "
);
    }
  }
}
复制代码

运行上面的代码,如果没有抛出异常的话,输出应该是这样的:

The door is open. The door is becoming unhinged. The door is closed. I'm putting a sweater on, regardless.

三个异常目前被注释掉了,现在让我们一个个的抛出他们。

开始

  • 在'try-with-resource'初始化代码块的异常(构造函数抛出)

如果OpenDoor的构造函数抛出异常时会发生什么?close()方法是否还会被自动调用?让我们来试一下就知道了,去掉构造函数中异常代码的注释:

public OpenDoor() throws  Exception { System.out.println("The door is open." ); throw new
 OpenException();
}

代码打印的结果如下:

The door is open. Is there a draftclass  OpenException I'm putting a sweater on, regardless.

可以看到,当构造函数抛出异常时try-with-resource代码体部分的代码没有被执行。当声明资源时,如果有异常抛出,可以认为资源并未正确初始化,所以并需要释放资源。然而,需要注意的时,如果其他资源已被正确初始化,那么还是会按照声明相反的顺序调用那些资源的close()方法。

  • try-with-resource代码块中抛出的异常

如果在swing方法中抛出异常,会发生什么呢?

The door is open. The door is becoming unhinged. The door is closed. Is there a draftclass  SwingException I'm putting a sweater on, regardless.

从上面的输出我们可以了解到:

  1. OpenDoor的构造方法被调用了,第一行输出
  2. OpenDoor的swing方法也被调用了,第二行输出
  3. 抛出了SwingException
  4. close方法被调用,第四行输出
  5. 异常被catch块捕获,第五行输出
  6. 执行finally代码块,地六行输出。

只是try-with-resources代码块的标准行为,尽管会使人很困惑:什么时候会执行close方法?规则是:任何AutoCloseable对象的close方法会在任何catch块代码之前被执行。

  • 在AutoCloseable对象的close方法中抛出异常
The door is open.
The door is becoming unhinged.
The door is closed.
Is there a draft? class CloseException
I'm putting a sweater on, regardless.

我是天王盖地虎的分割线

 

 




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4285030.html,如需转载请自行联系原作者

相关文章
|
存储 负载均衡 监控
JAVA问答4
JAVA问答4
141 0
|
SQL XML 存储
JAVA问答3
JAVA问答3
102 0
1071 小赌怡情(JAVA)
常言道“小赌怡情”。这是一个很简单的小游戏:首先由计算机给出第一个整数;然后玩家下注赌第二个整数将会比第一个数大还是小;玩家下注 t 个筹码后,计算机给出第二个数。若玩家猜对了,则系统奖励玩家 t 个筹码;否则扣除玩家 t 个筹码。
|
Java
Java常见的坑(二)
你猜上述程序输出的是什么? 是 ABC easy as 123 吗? 你执行了输出操作,你才发现输出的是 ABC easy as [C@6e8cf4c6 ,这么一串丑陋的数字是什么鬼? 实际上我们知道字符串与任何数值的相加都会变为字符串,上述事例也不例外, numbers输出其实实际上是调用了Object.toString()方法,让numbers转变为'[c' + '@' + 无符号的十六进制数。
58 0
|
Java 编译器 API
Java 17 浅析
openJDK官方介绍文档https://openjdk.java.net/projects/jdk/17/oracle官方文档https://docs.oracle.com/en/java/javase/17/index.html注意:IDEA需要升级到2021版本才能兼容jdk17下载安装JDK17官网下载页面https://www.oracle.com/java/technologies/d
1407 0
Java 17 浅析
|
Java 应用服务中间件 数据库连接
java导读
导读:      我们学习Java大概有3个方向,第一,桌面系统,包括C/S结构;第二,J2ME,面向无限领域,很有潜力的家伙,看看中国的手机用户就知道了。第三,面向企业应用、计算的平台,J2EE.      初次涉及Java领域,感觉到Java入门是好像没有C,C++入门快,工具也没有什么Turbo C,Visual C++好用(自己的破机器实在陪不起JBuilder,贪婪的家伙,以后一定要收拾她)。
1274 0
|
Java C++
对于Java的认识
1.运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统 Java编译器将 java 源文件编译为 class 字节码文件 Java分为三个体系JavaSE和JavaEE和JavaME,JavaSE是基础,标准版,JavaEE企业版,企业版,主要做大型网站,嵌入式产品,JavaME主要是嵌入式产品,微型版, 2.Java语言是简单的:为什么这么说,它与c和c++相比有哪些优点和长处?1.2.3.4.。
1205 0