- 浏览: 1370168 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
daye0209:
sohuexe 写道C++恐怕它还不行吧,推荐看看 http: ...
JNA入门实例 -
cxhcxheret:
...
每日一Vim(29)ctags -
qdujunjie:
学会了recording,感谢~~
每日一Vim(23)宏---Record、Play -
perfectionhello:
很棒的vim
每日一Vim(5)c命令 -
zc-111:
看完了才发现这篇文章果然是你写的
5分钟了解Mockito
Java SE 7 Exception的使用
在Java SE 7 中,作为Project Coin项目中众多有用的细小语言变化之一的加强型异常处理,现在来学习如何利用它。
简介:
在这边文章中,我们所涉及的一些变化是作为Java平台标准版7(Java SE 7)所发布,在JSR334(Java Specification Request)有详细的说明。现在我们重点讨论异常处理,特别是:multi-catch,rethrow,以及try-with-resources.
Multi-Catch Exceptions
多异常捕获已经加入到Java SE 7,他帮助我们更简便的进行异常处理,现在就把你的异常处理代码从Java SE7之前的版本迁移到Java SE7来阅读。
例1:
public class ExampleExceptionHandling { public static void main( String[] args ) { try { URL url = new URL("http://www.yoursimpledate.server/"); BufferedReader reader = new BufferedReader(newInputStreamReader(url.openStream())); String line = reader.readLine(); SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY"); Date date = format.parse(line); } catch(ParseException exception) { // handle passing in the wrong type of URL. } catch(IOException exception) { // handle I/O problems. } catch(ParseException exception) { // handle date parse problems. } } }
在过去,如果你想要相同的逻辑代码在上面的三个异常代码块的时候,你不得不在PaseException和IOException中拷贝粘贴代码,一个缺乏经验或者懒惰的程序员可能认为像下面这样也是OK的。
例2:
public class ExampleExceptionHandlingLazy { public static void main( String[] args ) { try { URL url = new URL("http://www.yoursimpledate.server/"); BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); String line = reader.readLine(); SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY"); Date date = format.parse(line); } catch(Exception exception) { // I am an inexperienced or lazy programmer here. } } }
在例2代码示例中最大的毛病就是会产生不可预料的副作用,任何代码在try代码块可能产生异常,所有异常将全部由catch子句所处理。如果一个异常既不是ParseException也不是IOException(例如:SecurityException),此异常仍然会被捕获,但是上游用户去不知道真正发生了什么?这种吞并式的异常将很难调试。
为了方便程序员,JavaSE7现在引入了多异常捕获,这样程序员就可以合并多个catch字句为一个单独的代码块,而不需要去使用危险的吞并似的一个异常捕获所有,或者拷贝整个代码块。
例3:
public class ExampleExceptionHandlingNew { public static void main( String[] args ) { try { URL url = new URL("http://www.yoursimpledate.server/"); BufferedReader reader = new BufferedReader( new InputStreamReader(url.openStream())); String line = reader.readLine(); SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY"); Date date = format.parse(line); } catch(ParseException | IOException exception) { // handle our problems here. } } }
示例3就展示了怎么合理的合并两个catch块语句,注意catch子句的语法(ParseException|IOException),catch子句可以捕获ParseException和IOException。所以如果想多个不同的异常共用相同的异常处理代码,那么就可以使用这种管道语法(ExceptionType…|ExceptionType variable)。
Rethrowing Exceptions
当你在处理异常的时候,有时候想把一个处理完后的异常往外抛的时候,没有经验的程序员可能认为用下面这种方式操作是合理的
例4:
public class ExampleExceptionRethrowInvalid { public static void demoRethrow()throws IOException { try { // forcing an IOException here as an example, // normally some code could trigger this. throw new IOException(“Error”); } catch(Exception exception) { /* * Do some handling and then rethrow. */ throw exception; } } public static void main( String[] args ) { try { demoRethrow(); } catch(IOException exception) { System.err.println(exception.getMessage()); } } }
很遗憾的是编译器没发完成编译工作,下面这段代码展示了如何去处理完异常后再往外抛。
例5:
public class ExampleExceptionRethrowOld { public static demoRethrow() { try { throw new IOException("Error"); } catch(IOException exception) { /* * Do some handling and then rethrow. */ throw new RuntimeException(exception); } } public static void main( String[] args ) { try { demoRethrow(); } catch(RuntimeException exception) { System.err.println(exception.getCause().getMessage()); } } }
上面这个例子的毛病就在于不能抛出原生的异常,他用另外一个异常包裹了,这就意味着代码的下游需要注意他是被包装了的。所以为了捕获到这个确切的原生异常,在Java SE7中做出变化是必须的,如下代码:
例6:
public class ExampleExceptionRethrowSE7 { public static demoRethrow() throws IOException { try { throw new IOException("Error"); } catch(Exception exception) { /* * Do some handling and then rethrow. */ throw exception; } } public static void main( String[] args ) { try { demoRethrow(); } catch(IOException exception) { System.err.println(exception.getMessage()); } } }
上面的示例在JavaSE7中能正确的编译(译者注)
Try-with-Resources
你可能注意到了在第一个例子中有这样一个问题(这就是为什么当你不知道示例代码做了些什么的时候,你永远也不要在生产环境中使用)。这个问题就是没有对资源的清空。例7是一个修改的版本,描述了怎样在JavaSE7之前的版本中校正这个问题。
例7:
public class ExampleTryResources { public static void main(String[] args) { BufferedReader reader = null; try { URL url = new URL("http://www.yoursimpledate.server/"); reader = new BufferedReader(new InputStreamReader(url.openStream())); String line = reader.readLine(); SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY"); Date date = format.parse(line); } catch (MalformedURLException exception) { // handle passing in the wrong type of URL. } catch (IOException exception) { // handle I/O problems. } catch (ParseException exception) { // handle date parse problems. } finally { if (reader != null) { try { reader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } } }
我们注意到代码中添加了一个final代码块,如果BufferedReader被赋值了,它将被关闭,而且变量reader也已经移到了try代码块的外面了。当一个I/O异常发生的时候关闭字符流就要多些很多的代码。
在JavaSE7中,可以更简洁更清爽,如例8所示,这种新的语法允许你把资源作为try代码块的一部分,这意味着可以提前定义好资源然后执行完try代码块的时候虚拟机将自动关闭资源。
例8:
public static void main(String[] args) { try (BufferedReader reader = new BufferedReader( new InputStreamReader( new URL("http://www.yoursimpledate.server/").openStream()))) { String line = reader.readLine(); SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY"); Date date = format.parse(line); } catch (ParseException | IOException exception) { // handle I/O problems. } }
在例8中实际发生变化的是在try(….)语句,需要注意的是这个特性只有在资源实例实现了AutoCloseable接口的实例才能生效
总结:
异常处理在javaSE7中,你不仅可以写出更简洁的程序,正如multi-catch示例所演示的一样,而且在可以处理完部分异常后再往外抛出去。如re_throw 例子所示,JavaSE7同样有助于减少易于出错的异常清理。正如我们在try-with resource例子中看到的一样。这些特征和其他Project Coin项目中提供的一样,能使Java程序员写代码更有效率以及写出更高效的代码。
附上自己的一点感受:第一次这样认真的去翻译一遍文章,以往看完一遍文章可以不到二十分钟,但是翻译工作花了我两个小时,非常认真的在做,发现翻译不仅可以学外语,还可以学语文。对自己的语言组织也有提高,终于体会到翻译书籍的人特别不容易。2012/3/1 1:20
原文连接http://www.oracle.com/technetwork/articles/java/java7exceptions-486908.html
评论
发表评论
-
helloworld
2013-04-13 00:31 1hello,iteye,just a test -
helloworld
2013-04-13 00:23 1hello,iteye,just a test -
快速了解Log4J
2012-12-13 00:23 27711Log4J的三个组件: Logger:日志记录器,负责收集 ... -
JNA入门实例
2012-12-09 20:22 19983JNA(Java Native Access):建立在JNI之 ... -
Effective Java 读书笔记-----异常
2012-12-08 17:25 0学习一门编程语言,需要掌握三点: 其一:了解语言的核心:需要 ... -
libvirt为OpenStack Nova Folsom版带来的变化
2012-11-29 00:10 4210libvirt为OpenStack Nova Fo ... -
Ubuntu安装配置JDK、Tomcat 、Eclipse
2012-11-19 15:22 3233在Linux下安装JDK Tomcat等Java运行环境,安装 ... -
Java Thread 部分方法及概念
2012-08-25 23:58 3166这里并不打算说明什么叫线程,但是可以简单举一线程的应用场景 ... -
5分钟了解Mockito
2012-05-05 16:15 106005一、什么是mock测试, ... -
Java利器收集
2012-04-20 11:34 4test -
循序渐进学编程
2012-04-07 19:14 1356注:本文系博主最先发表于伯乐在线 软件开发人员是一个日 ... -
Java程序员,不要过度依赖于String
2012-04-03 13:43 7633在Java中永远,永远不要过度使用String ... -
Java程序员,不要过度依赖于String
2012-04-03 13:41 1在Java中永远,永远不要过度使用String ... -
成为一名卓越Java开发者的十个建议
2012-03-03 19:42 2204成为一名卓越Java开 ... -
一些实用类
2012-02-16 01:55 21481、TimeUnit TimeUnit出现在concurre ... -
关于并发的一篇短文
2012-02-14 01:02 1629JAVA并发 前言:这是一篇根据《java编程思想》并发章节 ... -
谈谈接口
2011-12-25 01:57 1345接口 一、此接口非 ... -
对Boolean.getBoolean(String name)的己见
2011-10-12 15:24 48771、今天遇到这样一件事:想把String类型的true和fal ... -
LinkedList源码分析
2011-09-24 03:14 1594LinkedList的源码分析 LinkedLi ... -
对optional operations的理解
2011-08-11 01:36 0optional operations(可选操作):接口中的一 ...
相关推荐
这个API文档,"JAVA SE API HELP",是一个重要的学习资源,它包含了详细的类库文档,帮助开发者理解并有效地使用Java SE的各种功能。 1. **类库概述**:Java SE API 包含了许多包,如`java.lang`、`java.io`、`java...
Java Standard Edition (SE) API 1.7,也被称为Java 7,是Java开发的关键组成部分,为构建桌面应用、服务器端应用以及网络应用提供了丰富的功能和接口。这个API包括了各种核心类库,使得开发者能够编写高效、健壮的...
7. **Java性能优化**: - 内存管理,避免内存泄漏,减少不必要的对象创建。 - 使用StringBuilder或StringBuffer代替字符串连接操作。 - 避免过度使用同步,考虑使用并发工具类(如ConcurrentHashMap)。 8. **...
7. **异常处理**:`java.lang.Throwable`及其子类如`Exception`和`Error`构成了Java的异常处理机制。通过`try-catch-finally`语句块,开发者可以优雅地处理程序运行时可能出现的问题。 8. **反射机制**:`java.lang...
Oracle has two products that implement Java Platform Standard Edition (Java SE) 7: Java SE Development Kit (JDK) 7 and Java SE Runtime Environment (JRE) 7. JDK 7 is a superset of JRE 7, and contains ...
### 毕向东Java SE视频教程整理笔记 #### 第一章:编程基础 - **Java的特性和优势**:Java语言具有多种特性,包括简单性、面向对象、可移植性(一次编写,到处运行)、高性能、分布式、动态性、多线程、安全性以及...
Java SE API中文版的文档为开发者提供了详细的接口说明、实例和使用指导,极大地促进了Java开发的效率和代码质量。通过深入学习和熟练掌握这些API,开发者可以编写出高效、稳定且易于维护的Java应用程序。
7. **异常处理**:Java的异常处理机制是通过`try-catch-finally`块来捕获和处理运行时错误。异常类层次结构基于`java.lang.Throwable`,分为Error和Exception两大类。 8. **集合框架**:Java集合框架包括List(如...
### Oracle Certified Associate, Java SE 7 Programmer Study Guide #### 知识点概览 本学习指南旨在帮助考生准备Oracle Certified Associate (OCA) Java SE 7 Programmer I 认证考试(代码1Z0-803)。该指南覆盖...
1. **异常分类**:Java中的异常主要分为两大类:运行时异常(RuntimeException)和检查异常(Checked Exception)。运行时异常通常是由程序逻辑错误引起的,可以不予捕获;而检查异常必须在程序中被捕获或声明抛出。...
根据给定文件的信息,我们可以总结出“Java_SE基础毕向东老师全程笔记”中涉及的关键知识点。这份笔记由毕向东老师授课,涵盖了Java的基础知识及进阶主题,具体章节包括编程基础、数组、面向对象程序设计等多个方面...
- **异常类**:Java使用Exception类及其子类表示程序运行时的错误和异常情况。 - **try-catch-finally**:通过这三个块处理异常,catch捕获异常,finally确保某些代码无论如何都会执行。 - **throw和throws**:...
7、JAVA面向对象之三大特性 8、JAVA面向对象之函数、堆和栈、访问修饰符 9、JAVA面向对象关键字 10、JAVA面向对象抽象类abstract 11、JAVA面向对象接口interface 12、JAVA面向对象之内部类、匿名内部类 13、...
9. **异常处理**:Java SE 6的异常处理机制强化了错误报告和处理,`Exception`类及其子类用于捕获和处理程序运行时可能出现的问题。 10. **注解(Annotation)**:Java SE 6引入了注解,这是一种元数据,可以附加到...
《Java SE 类库查询手册》是一本专门为Java开发者编写的详尽参考资料,旨在帮助开发者深入理解和有效利用Java标准版(Java SE)类库。这本书以中文形式呈现,使得那些英语能力有限的程序员也能轻松查阅,避免了语言...
### Oracle认证Java SE 8程序员考纲解析 #### 一、Java基础知识 - **变量作用域**:理解局部变量、类变量(静态变量)的作用范围。 - **Java类的结构**:掌握类的基本组成,包括属性、方法、构造器等。 - **创建可...
7. **异常处理**:`java.lang.Throwable`是所有异常和错误的根类,包括`Exception`和`Error`。异常处理机制通过`try-catch-finally`语句块来捕获和处理运行时问题。 8. **反射**:`java.lang.reflect`包提供了反射...
### Java SE 基础知识点梳理 #### 一、字符串(String) **1. 字符串定义** 在 Java 中,`String` 类是最常用的字符串表示方式。`String` 类是不可变的,这意味着一旦创建了一个 `String` 对象,它的值就不能被改变...
这份课堂笔记主要涵盖了在达内培训期间学习的基本 Java SE 相关知识,包括但不限于 Java 的基本语法、类与对象的概念、包的使用、数据类型的转换以及一些进阶的编程技巧等。 #### 二、Java 基本概念 1. **Java ...
在Java中,异常分为两大类:运行时异常(`RuntimeException`)和非运行时异常(通常指的是检查型异常,`Exception`的子类但不包括`RuntimeException`及其子类)。这两类异常在处理方式上有明显的区别。 **运行时...