异常

  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):异常和可变长参数处理的更多相关文章

  1. jdk1.5新特性之------->可变参数

    /* jdk1.5新特性之------->可变参数 需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定). 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1 ...

  2. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  3. JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)

    5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...

  4. JDK1.7新特性

    jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...

  5. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  6. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

  7. JDK1.8新特性——Optional类

    JDK1.8新特性——Optional类 摘要:本文主要学习了JDK1.8新增加的Optional类. 部分内容来自以下博客: https://www.cnblogs.com/1ning/p/9140 ...

  8. JDK1.8 新特性

    jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...

  9. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

随机推荐

  1. centos下安装pip2

    # 背景 新机器,安装完python2后发现竟然不自带pip,按照我的理解现在新版本的python,不管是2还是3都会自带pip的.没办法,需要自己去安装pip的 # 步骤 1. 最开始查到的是通过y ...

  2. 【javascript】点击复制内容的实现

    各种站点有很多类似的代码,不过都是拿来即用,连个解释也没有.大概看了一下,现在主要使用的有两种办法: 1.documen.execCommand("Copy")或者window.c ...

  3. ubuntu 16.04.1 nginx彻底删除与重新安装

    1.删除nginx,-purge包括配置文件 sudo apt-get --purge remove nginx 2.移除全部不使用的软件包 sudo apt-get autoremove 3.罗列出 ...

  4. .net core执行dotnet ef migrations createmodel等命令出错

    .net core执行dotnet ef migrations createmodel等命令出错 执行dotnet ef migrations createmodel.dotnet ef migrat ...

  5. BitAdminCore框架更新日志20180524

    20180524更新内容 本次更新两个内容,一是增加windows service,二是增加邮件发送功能. windows service windows service用于定期跑服务,网上有一些提供 ...

  6. asp.net mvc 3 linq实现数据的增、删、改、查、

    添加数据 定义一个对象: public class Student { public int id{get; set;} public string Name{get;set;} public str ...

  7. 字节码执行方式--解释执行和JIT

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.两种执行方式: 解释执行(运行期解释字节码并执行) 强制使用该模式:-Xint 编译为机器码执行(将字 ...

  8. 黄包车比赛 python学习

    将性别进行编码: https://github.com/Bifzivkar/Boutique-Travel-Services-Predict/blob/master/feature/2_feature ...

  9. 红与黑(DFS)

    描述有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动.请写一个程序,计算你总共能够到达多少块黑色的瓷砖.输入包括多个数据集合.每个数据集 ...

  10. Centos 7.x 安装配置tomcat-8过程梳理

    ----------注意CentOS7.x中的selinux和firewalld都关闭.而且一.二.三部分都是独立的,所以发现8081和8080端口时不要慌哦. 原创,朋友们转载时请著名出处. 一.安 ...