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 ...
随机推荐
- CVE-2018-7600 Drupal核心远程代码执行漏洞分析
0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...
- Jmeter+Ant生成结果报告时,MinTime、MaxTime显示NaN的问题
将apache-jmeter-2.13\lib中的serializer-2.7.2.jar.xalan-2.7.2.jar复制到apache-ant-1.9.6\lib中即可: 复制前生成:
- 解决IIS中Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
- Spring @SCHEDULED(CRON = "0 0 * * * ?")实现定时任务
Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocati ...
- Problem H: 小姐姐的QQ号(DFS)
Contest - 河南省多校连萌(四) Problem H: 小姐姐的QQ号 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 297 Solved: ...
- php使用xa规范实现分布式事务处理
具体实例如下,对数据表进行插入和删除操作,两个操作都成功才会修改数据表,否则数据表不变. <?php class connDb{ private static $host = 'jxq-off- ...
- openpyxl读写Excel文件
安装 pip install openpyxl 一个简单的实例: 最初的表格 #!/usr/bin/env python # -*- coding:utf-8 -*- import openpyxl ...
- linux防火墙(五)—— 防火墙的规则备份与还原
一.第一种备份还原用法,使用工具 iptables-save >/opt/iprules.txt iptables-restore < /opt/iprules.txt #注意导入的文件必 ...
- CentOS+uwsgi+django+nginx 环境部署及分析
写在部署前 在线上部署django项目时,比较成熟的方案是:nginx + uWSGI + Django. nginx和Django 都比较熟悉了,uWSGI是什么呢?WSGI是一个协议,python ...
- 架构师养成记--20.netty的tcp拆包粘包问题
问题描述 比如要发ABC DEFG HIJK 这一串数据,其中ABC是一个包,DEFG是一个包,HIJK是一个包.由于TCP是基于流发送的,所以有可能出现ABCD EFGH 这种情况,那么ABC和D就 ...