异常

  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. Docker 入门笔记

    Docker 可以理解为一个轻量化的虚拟机, 启动速度快,本身占的资源小 [重要], 容器里是不能保存数据的,容器只要一停止, 所有的数据都会丢失,所以如果重要的数据, 都需要通过配制,把数据保存在 ...

  2. django drf 级联数据和RetrieveModelMixin

    1.定义View from django.shortcuts import render from rest_framework.views import APIView from rest_fram ...

  3. WPF制作歌词动画

    最近再做一个UWP的音乐播放器,今天实现了歌词动画,不是滚动的,滚动的慢慢研究 思路:在右边放了三个textBlock,设置 textBlock的effect属性 <TextBlock.Effe ...

  4. dockerfile 构建tomcat

    事先下载好tomcat和jdk的二进制包. 下载地址https://pan.baidu.com/s/1kWWHGEV 值得一说的是 tomcat的官方镜像 剪切了很多jdk和系统命令,所以生产环境建议 ...

  5. RxJava / RxAndroid

    RxJava 是什么 RxJava 是函数响应式编程框架,它用观察者设计模式. 常用来做异步数据处理,在安卓中用来代替传统的 AsyncTask + Handler 的组合结构. RxJava 架构简 ...

  6. 1087 1 10 100 1000(打表 set 数学)

    1087 1 10 100 1000 题目来源: Ural 1209 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 1,10,100,1000... ...

  7. 手把手教渗透测试人员打造.NET可执行文件

    在进行渗透测试的过程中,我们有时候会希望使用可执行文件来完成某些任务.最近,我们在测试过程中拿下了一个网站,从而获得了一次发动水坑攻击的机会. 原文地址:https://www.peew.pw/blo ...

  8. 【C++对象模型】使用gcc、clang和VC++显示C++类的内存布局

    引言 各种C++实现对C++类/对象的内存布局可能有所不同,包括数据成员的顺序.虚函数表(virtual table: vtbl)的结构.继承关系的处理等.了解C++类/对象的布局,对于理解C++各种 ...

  9. 2016级算法期末上机-E.中等·ModricWang's Fight with DDLs II

    1125 ModricWang's Fight with DDLs II 思路 圆内被划分部分数的计算方式如下: 圆内部的每一个交点都使得总份数增加了一:除此之外,每一根直线段最后抵达圆周时,总份数也 ...

  10. Java多线程——同步容器类

    1.同步容器类 同步容器类包括Vector和Hashtable,是早期JDK的一部分,这些类实现的方法是:将它们的状态封装起来,并对每个共有的方法进行同步,使得每个线程只有一个线程能访问它们. 1.1 ...