java 1.7 可变参数,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 useVarargs(T... args) {

return args.length > 0 ? args[0] : null;

}

SafeVarargs

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 ...

jdk1.8新特性应用之Iterable

我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...

随机推荐

tushare

tushare TuShare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程,能够为金融分析人员提供快速.整洁.和多样的便于分析的数据, ...

IOS开发基础知识--碎片24

1:兼容字体大小6plue跟它以下的区别 #define FONT_COMPATIBLE_SCREEN_OFFSET(_fontSize_) [UIFont systemFontOfSize:(_fo ...

配置struts2+spring,springmvc

Struts2+Spring整合 一.spring负责注入,struts2负责它自己的工作.这样不是很符合spring作为ioc容器的全部功能,不推荐. 二.spring负责全部bean和struts ...

在standalone模式下运行yarn 0.9.0对HDFS上的数据进行计算

1.通读http://spark.incubator.apache.org/docs/latest/spark-standalone.html 2.在每台机器上将spark安装到/opt/spark ...

[MySQL] 忘记root账户密码怎么办

一.缘由 由于各种原因,我们会忘记mysql的root密码. 二.解决办法 方法一:skip-grant-tables方式启动 1.停止mysql服 务 service mysqld stop 2.以 ...

iOS 键盘类型UIKeyboardType

UIKeyboardTypeDefault: UIKeyboardTypeASCIICapable: UIKeyboardTypeNumbersAndPunctuation: UIKeyboardTy ...

MATLAB命令大全和矩阵操作大全

转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵 ...

Python基础——输出[print()]与输入[input()]

Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ Python是一种面向对象的解释型计算机程序设计语言,Python的特点是"简单"." ...

linux locate命令

1.命令简介         locate(locate) 命令用来查找文件或目录. locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/ml ...

Mysql连接错误:Mysql Host is blocked because of many connection errors

环境:linux,mysql5.5.31错误:Host is blocked because of many connection errors; unblock with 'mysqladmin f ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值