JDK1.7新特性(2):异常和可变长参数处理
异常
jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面。
1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可以将一个异常信息追加到另一个异常信息之后:
/**
* 这是第一种防止前面异常被覆盖的方法,通过在finally块中判断前面是否有异常抛出
* 如果有则最终抛出的异常为原来的异常,没有则最终抛出的异常为finally块中的异常。
* 此时只能抛出一种异常信息。
* @param fileName
*/
private void readFile(String fileName) {
FileInputStream input = null;
IOException readException = null;
try {
input = new FileInputStream(fileName);
} catch (IOException ex) {
readException = ex;
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
// 如果前面没有出现异常,则说明整个异常是此处产生的
if (readException == null) {
readException = e;
}
}
} if (readException != null) {
throw new RuntimeException(readException);
}
}
} /**
* 这是第二种防止异常被覆盖的方法,利用jdk7的新特性。通过在finally块的异常捕获代码中判断前面是否抛出异常,如果抛出异常
* 则将finally块中抛出的异常追加在前面的异常信息之后。这样同时可以抛出两种异常信息类型。
* @param fileName
*/
private void readFile2(String fileName) {
FileInputStream input = null;
IOException readException = null;
try {
input = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
readException = e;
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
// 如果前面抛出的异常不为空,这里将finally块中的异常信息添加到原异常信息后面
if (readException != null) {
readException.addSuppressed(e);
} else {
readException = e;
}
}
}
if (readException != null) {
throw new RuntimeException(readException);
}
}
}
addSuppressed
2. catch块增强,可以同时捕获多个异常,来进行统一的处理:
/**
* 这里测试jdk7的新特性,一个catch语句中可以捕获多种异常,以 | 分割。
*/
private void catchMore() {
// 在jdk1.7新特性这本书中说一个catch块中可以同时捕获属于父子关系的异常(只要子在前父在后,同分开的catch块中的顺序),但实际上在jdk1.8中时不允许的。
try {
int a = Integer.valueOf("aaa");
throw new IOException();
}
/*
会报NumberFormatException已经被捕获
catch (NumberFormatException | RuntimeException | IOException e) { }*/ catch (NumberFormatException | IOException e) { } catch (RuntimeException e) {
}
}
catch
3. throw语句增强,异常在第二次抛出之后,仍然能够准确的知道最原始的异常类型:
/**
* jdk1.7之后,即使异常被重新抛出,编译器也知道原始异常类型,而不会被再抛出的异常类型所干扰。
* 如果在jdk1.6或者之前的版本,第二个catch只能是ExceptionA,因为原始的ExceptionASub2被抹去了。
*/
private void testRecatch() {
try {
throw new ExceptionASub2();
} catch (ExceptionA e) {
try {
throw e;
} catch (ExceptionASub2 e2) { // 如果是catch (ExceptionASub1 e2) 那么会报编译错误,因为编译器知道原始异常是ExceptionASub2 }
}
} class ExceptionA extends Exception {}
class ExceptionASub1 extends ExceptionA {}
class ExceptionASub2 extends ExceptionA {}
recatch
4. try语句增强,try块可以进行资源管理:
/**
* jdk1.7之后,对try块进行了增强,使其中声明的资源总是可以正确的被释放,而不需要多余的finally块来单独处理。
* 这有点像python的 with open("a.txt") as file 语句一样。
* 需要注意的是,此时资源必须实现AutoCloseable接口,实际上jdk1.7中通过
* public interface Closeable extends AutoCloseable,将Closeable继承于AutoCloseable接口。
* 如果我们要自己实现资源的关闭,只需直接实现AutoCloseable接口即可。
*/
private void tryWithResource() {
String fileName = "a.txt";
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { } catch (FileNotFoundException e) { } catch (IOException e) { }
}
try
变长参数
jdk1.7在变长参数和范型结合使用的时候,增加了一个@SafeVarargs。通过该注解来告诉编译器参数类型的安全性,以此来解决每次调用都出现编译警告的问题。
/**
* 在jdk1.7之前,需要使用@SuppressWarnings("unchecked")注解来给每一个调用该方法的地方取消警告
* 。这是因为变长参数的实际值时通过数组来传递的,而数组中传递的时不可具化的范型对象,自身存在类型安全问题,所以编译器
* 会给出警告。这在调用java.utils.Arrays.asList方法和java.util.Collections.addAll方法中也会遇到。
* jdk1.7中提供了在该方法声明的地方加上@SafeVarargs注解。来表示该方法在与范型结合使用的时候不会出现类型安全问题。
* 此时再调用该方法,编译器不会给出警告信息。
* 不过需要注意的是,该方法必须声明为static或者final方法,否则会出现编译错误。
*/
@SafeVarargs
public static<T> T useVarargs(T... args) {
return args.length > 0 ? args[0] : null;
}
SafeVarargs
JDK1.7新特性(2):异常和可变长参数处理的更多相关文章
- jdk1.5新特性之------->可变参数
/* jdk1.5新特性之------->可变参数 需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定). 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1 ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)
5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...
- JDK1.7新特性
jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- JDK1.8新特性——Optional类
JDK1.8新特性——Optional类 摘要:本文主要学习了JDK1.8新增加的Optional类. 部分内容来自以下博客: https://www.cnblogs.com/1ning/p/9140 ...
- JDK1.8 新特性
jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
随机推荐
- [Oracle]Oracle数据库CPU利用率很高解决方案
Oracle数据库经常会遇到CPU利用率很高的情况,这种时候大都是数据库中存在着严重性能低下的SQL语句,这种SQL语句大大的消耗了CPU资源,导致整个系统性能低下.当然,引起严重性能低下的SQL语句 ...
- 自己从0开始学习Unity的笔记 III (C#随机数产生基础练习)
自己开始尝试弄一下随机数,照着方法,自己做了个英雄打怪兽的测试 int heroAttack; ; ; Random attack = new Random(); //初始化一个随机数的类 heroA ...
- C#Doc写入 XML文件
HTML是XML的先驱,XML延续了HTML的简单性的优点.XML不是用来替代HTML的, XML和HTML为不同的目的而设计: XML被设计用来描述数据,其焦点是数据的内容.HTML被设计用来显示数 ...
- 如何将JPG格式的图片转化为带地理坐标的TIFF格式
最近有个项目需要用到开源软件GeoServer,数据源是一张高分辨率的2.5维图片,格式是jpg的,由于GeoServer不支持jpg格式的发布,因此考虑到要进行格式转换,将其转换成tiff格式. 1 ...
- iOS Mac忘记登录密码的4种解决方法
4种方法: 一.使用Apple ID重置用户账户密码 使用这个方法有一个前提 如上图红框,此项必须勾选,否则无法使用Apple ID重置密码.(如果你不记得有没有勾选,则你起码要记得首次启动 OS X ...
- 2、Windows下安装配置Redis
windows下redis软件开源安装包挂载到github上,下面将详细介绍如何在windows下安装redis服务器 下载地址:https://github.com/MSOpenTech/redis ...
- “全栈2019”Java第九十六章:抽象局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 洛谷P5280 [ZJOI2019]线段树(线段树)
题面 传送门 题解 考场上就这么一道会做的其它连暴力都没打--活该爆炸-- 首先我们得看出问题的本质:有\(m\)个操作,总共\(2^m\)种情况分别对应每个操作是否执行,求这\(2^m\)棵线段树上 ...
- 工具IDEA 配置springboot+maven项目
工具IDEA 配置springboot+maven项目 首先安装IDEA,至于怎么安装就不介绍了.. 第一步 配置maven环境 首先安装maven,先在网上下载一个maven包.在IDEA的sett ...
- Jmeter中一些概念的理解——90%响应时间、事务、并发
一.90%响应时间(参考虫师博客) 90%Line 一组数由小到大进行排列,找到他的第90%个数(假如是12),那么这个数组中有90%的数将小于等于12 . 用在性能测试的响应时间,也就是90%请求 ...