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 ...
随机推荐
- Ubuntu下Jenkins(docker)配置Docker远程启动
背景: 在做用Jenkins构建docker的操作,需要用Jenkins调用docker命令,需要先安装docker-build-step插件,然后开启docker远程访问. 默认情况下,Docker ...
- 记一次Angular2环境搭建及My First Angular App小demo呈现
参考连接?不如说是照搬链接.AngularJs官网地址快速起步地址. 对于一个一直只是用jq,偶尔学习点Knockout js,了解一点mvvm结构的前端来说,学习Angular2还是有点困难的.好了 ...
- C#——Socket
最近公司让我搞个socket小程序(服务端). 主要的功能:客户端发字符串到服务端,服务端接收后在界面上显示. 参照了网上许多代码,自己从中修改整理代码. public Form4() { Initi ...
- leetcode 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串"". 示例 1: 输入: ["flower","flow" ...
- WP8.1StoreApp(WP8.1RT)---第三方启动
8.1的协议和wp8是相互通用的 被启动: 相比较wp8而言,基本变化不大,但添加方式更直观了 1:打开Package.appxmanifest 2:切换到"声明"选项卡 3:左侧 ...
- iOS错误 - too many open files (error = 24)
碰到这个错误是在用 UIImageView 显示图片的时候.UIImage 用的是 imageNamed 方法.错误原因是打开了太多的文件.应该是太多文件的打开导致了 UIImage 的 cache ...
- Android - Telephony API 1.6
SignalStrength: 1. public int getGsmSignalStrength() : GSM Signal Strength, valid values are (0-31, ...
- PHP 代码优化测试【Benchmark数据测试】
由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 : --> 点击这里 Benchmark测试之前我们先来了解Benchmark.直接下载:ht ...
- Remoteland HDU - 4196
题意: 给出一个n,在[1, n] 中挑选几个不同的数相乘,求能的到的最大完全平方数 解析: 最大的肯定是n!, 然后n!不一定是完全平方数 (我们知道一个完全平方数,质因子分解后,所有质因子的质数均 ...
- [文文殿下]基本的DP技巧
. 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩 ...