今天主要研究Java se 7中异常处理的新功能.从今天开始正在将jdk7的说法改为java se 7跟oracle官网的一致

一、新增了try-with-resource 异常声明

在JDK7中只要实现了AutoCloseable或Closeable接口的类或接口,都可以使用try-with-resource来实现异常处理和资源关闭。下面做一下

JDK7以前:

static String readFirstLingFromFile(String path) throws IOException{

BufferedReader br=null;

try{

br=new BufferedReader(new FileReader(path));

return br.readLine();

}catch(IOException e){

e.printStackTrace();

}finally{

if(br!=null)

br.close();

}

return null;

}

JDK7 及以后版本:

static String readFirstLineFromFile(String path) throws IOException {

try (BufferedReader br = new BufferedReader(new FileReader(path))) {

return br.readLine();

}

}

通过以上对比我们可以发现具有以下优点:

1、代码更精练。在Java se 7以前版都有finally块,如果使用一些框架可能会将finally块交由框架处理,如spring。在jdk7及后的版本,只要资源类实现了AutoCloseable或Closeable程序在执行宛try块后会自动close所使用的资源无论br.readLine()是否抛出异常。我估计针对jdk7像spring这些框架也会做出一些比较大的调整。

2、代码更完全。在出现资源泻漏的程序中,很多情况是开发人员没有或没有正确地关闭资源导致的。JDK7后采用try-with-resource的方式,则可以将资源关闭这种与业务实现没有很大直接关系的工作交给JVM完成。省去了部分开发中可能出现的代码风险。

异常抛出顺序。在Java se 7中的try-with-resource机制中异常的抛出顺序与Java se 7以前的版本有一点不一样。

JDK7以前如果rd.readLine()与rd.close()(在finally块中)都抛出异常则只会抛出finally块中的异常,不会抛出rd.readLine();中的异常。这样经常会导致得到的异常信息不是调用程序想要得到的。

JDK7及以后版本中如果采用try-with-resource机制,如果在try-with-resource声明中抛出异(可能是文件无法打或都文件无法关闭)同时rd.readLine();也势出异常,则只会势出rd.readLine()的异常。

try-with-resource可以声明多个资源。下面的例子是在一个zip文件中检索文件名并将检索后的文件名存入一个txt文件中:

public static void writeToFileZipFileContents(String zipFileName, String outputFileName)

throws java.io.IOException {

java.nio.charset.Charset charset = java.nio.charset.Charset.forName("US-ASCII");

java.nio.file.Path outputFilePath = java.nio.file.Paths.get(outputFileName);

// Open zip file and create output file with try-with-resources statement

try (

java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);

java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)

) {

// Enumerate each entry

for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {

// Get the entry name and write it to the output file

String newLine = System.getProperty("line.separator");

String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;

writer.write(zipEntryName, 0, zipEntryName.length());

}

}

}

上面的例子,无论正常执行还是有异常抛出,zf和writer都会被执行close()方法。不过需要注意的是在JVM里调用的顺序是与声明的顺序相反。在JVM里调用的顺序为:

writer.close();

zf.close();

所在在使用时一定要注意。

声明资源时要分析好资源关闭顺序。

JDK7及后的版本的JDBC也支持try-with-resource.如下示例:

public static void viewTable(Connection con) throws SQLException {

String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";

try (Statement stmt = con.createStatement()) {

ResultSet rs = stmt.executeQuery(query);

while (rs.next()) {

String coffeeName = rs.getString("COF_NAME");

int supplierID = rs.getInt("SUP_ID");

float price = rs.getFloat("PRICE");

int sales = rs.getInt("SALES");

int total = rs.getInt("TOTAL");

System.out.println(coffeeName + ", " + supplierID + ", " + price +

", " + sales + ", " + total);

}

} catch (SQLException e) {

JDBCTutorialUtilities.printSQLException(e);

}

}

在try-with-resource中也可以有catch与finally块。只是catch与finally块是在处理完try-with-resource后才会执行。

二、catch多种异常并抛出新的异常

1、catch多种异常抛出一种异常

在JDK7以前大家会经常处理类似下面的代码:

try{

.........

}catch (IOException ex) {

logger.log(ex);

throw new SpecialException();

catch (SQLException ex) {

logger.log(ex);

throw new SpecialException();

}

这处理导致代码非常的难看,和许多重复的代码。JDK7后,大家可以这样处理:

try{

.........

}catch (IOException | SQLException ex) {

logger.log(ex);

throw new SpecialException();

}

注:在上面例子中的ex是隐式的final不可以在catch块中改变ex.

2、Rethrowing Exceptions with More Inclusive Type Checking

在Java se 7以前的版本。在方法声明中声明抛出的异常如果在方法体内没有抛出是不允许的。如下示例:

static class FirstException extends Exception { }

static class SecondException extends Exception { }

public void rethrowException(String exceptionName) throws Exception {

try {

if (exceptionName.equals("First")) {

throw new FirstException();

} else {

throw new SecondException();

}

} catch (Exception e) {

throw e;

}

}

上面这种代码其实很多开发人员都不喜欢,有的可能会提出一些改进方法,但无法做到非常精准的方法异常声明。下面看一下Java se 7的做法:

public void rethrowException(String exceptionName)

throws Exception, FirstException, SecondException {

try {

// ...

}

catch (Exception e) {

throw e;

}

}

异常处理这一块,Java se7改进了许多,开发人员需要认真的学习和试验。

今天先谈到这里。接下来将谈一下下划线在数字表示中的应用和泛型的改进。

java se7 变化_[转] Java se 7新特性研究(二)相关推荐

  1. Java SE 6 新特性 Instrumentation 新功能

    系列内容: 此内容是该系列的一部分:Java SE 6 新特性 Instrumentation 简介 利用 Java 代码,即 java.lang.instrument 做动态 Instrumenta ...

  2. Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD]

    Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD] Java SE 6 新特性: 对脚本语言的支持 Java SE 6 新特性: 对脚本语言的支持 邱 小侠 (qiuxiaox@c ...

  3. Java SE 8 新特性之旅 : Java开发世界的大变动

    我很自豪的成为了adopt-OpenJDK的一员,像其他专业团队成员一样,但是我只刚加入了8个月,我们一同经历了Java SE 8 的开发.编译.编码.讨论--等等,直到JDK上线.Java SE 8 ...

  4. Java SE 6 新特性: Instrumentation 新功能

    2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...

  5. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  6. Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩 ...

  7. java se 8 新特性_javase8-sample

    #javase8-sample 该项目仅用于学习java8,请随意Fork,更改 #博文地址 http://my.oschina.net/benhaile/blog 所有博客的源代码都能在这里 src ...

  8. java 分割一个_分割java

    [java]分割字符串工具类,霸气 jdk自带的 java 分割字符串,分割string,可以根据多个条件去分割.比如逗号,分号,逗号或者分号. 比如一个字符串:"abc,def;gh,ij ...

  9. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

最新文章

  1. tcp retransmission 出现的原因_浅谈TCP的keepalive机制
  2. 有空间感的图片环形滚动代码
  3. servlet和servlet-mapping的作用------转载于《简书》作者:简单的书写点
  4. linux树形目录结构存放,Linux目录结构
  5. 《C++ Primer》2.1.2节练习
  6. POJ1330-Nearest Common Ancestors【tarjan,LCA】
  7. java实现base64加密解密
  8. TensorFlow的可训练变量和自动求导机制
  9. python中符号输入_Python基础(输入、运算符)
  10. fastapi学习(一):输出hello world与基本运行方法
  11. sentinel接入网关应用_阿里sentinel配合gateway 网关限流
  12. Enterprise Library:DAAB + OLEDB/ODBC操作Access数据库
  13. 自适应布局 的 解决方案
  14. 在anaconda python开发套件下进行opencv的安装
  15. linux下C获取系统时间的方法
  16. 前端安全机制集合(不定期更新) -- 戴向天
  17. 关于高德地图自定义地图样式只显示中国的解决方案
  18. 简单几步解决 svchost 占用资源过高的问题
  19. ansible的安装部署与模块使用
  20. Markdown支持的emoji图标

热门文章

  1. 百度ERNIE——百度快车道记录
  2. 算法图解---狄杰斯特拉算法(原理+代码)
  3. 如何一步更改文件夹及其子文件夹/文件的权限
  4. 批量修改文件和文件夹权限win10
  5. Linux 配置nginx转发路由
  6. html radio 去掉圆点,修改 或去除html中的radio 单选按钮中的样式
  7. 运营人的下一个10年,如何对抗周期,现实持续增长
  8. Python学习笔记:5.2.8 javascript打飞机实战练习
  9. I like the subtle...(我喜欢这种淡淡的感觉)
  10. 【Ubuntu】自动更换添加倒计时的壁纸