`
lantian_123
  • 浏览: 1370168 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java SE 7 Exception的使用

 
阅读更多

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

 

在过去,如果你想要相同的逻辑代码在上面的三个异常代码块的时候,你不得不在PaseExceptionIOException中拷贝粘贴代码,一个缺乏经验或者懒惰的程序员可能认为像下面这样也是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子句可以捕获ParseExceptionIOException。所以如果想多个不同的异常共用相同的异常处理代码,那么就可以使用这种管道语法(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

 

3
1
分享到:
评论
5 楼 angel243fly 2012-03-02  
对翻译工作的辛苦深有体会
4 楼 sangshuye 2012-03-02  
论坛应该改下了。。。。。顶的可以不说理由,,,踩的一定说理由。。。。
3 楼 javabkb 2012-03-02  
赞楼主,讲得很好
2 楼 斌-黄 2012-03-02  
:idea:  ,不过说实话写起来更别扭了。
1 楼 chen592969029 2012-03-01  
给力,感谢分享~~~~

相关推荐

    JAVA SE API HELP

    这个API文档,"JAVA SE API HELP",是一个重要的学习资源,它包含了详细的类库文档,帮助开发者理解并有效地使用Java SE的各种功能。 1. **类库概述**:Java SE API 包含了许多包,如`java.lang`、`java.io`、`java...

    Java SE API 1.7 英文版(lang)

    Java Standard Edition (SE) API 1.7,也被称为Java 7,是Java开发的关键组成部分,为构建桌面应用、服务器端应用以及网络应用提供了丰富的功能和接口。这个API包括了各种核心类库,使得开发者能够编写高效、健壮的...

    java se 课件

    7. **Java性能优化**: - 内存管理,避免内存泄漏,减少不必要的对象创建。 - 使用StringBuilder或StringBuffer代替字符串连接操作。 - 避免过度使用同步,考虑使用并发工具类(如ConcurrentHashMap)。 8. **...

    Java-SE-class-library-.zip_java se

    7. **异常处理**:`java.lang.Throwable`及其子类如`Exception`和`Error`构成了Java的异常处理机制。通过`try-catch-finally`语句块,开发者可以优雅地处理程序运行时可能出现的问题。 8. **反射机制**:`java.lang...

    java7帮助文档

    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 SE视频教程整理笔记 #### 第一章:编程基础 - **Java的特性和优势**:Java语言具有多种特性,包括简单性、面向对象、可移植性(一次编写,到处运行)、高性能、分布式、动态性、多线程、安全性以及...

    Java SE API中文版

    Java SE API中文版的文档为开发者提供了详细的接口说明、实例和使用指导,极大地促进了Java开发的效率和代码质量。通过深入学习和熟练掌握这些API,开发者可以编写出高效、稳定且易于维护的Java应用程序。

    张龙 java se课程笔记

    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, Java SE 7 Programmer Study Guide #### 知识点概览 本学习指南旨在帮助考生准备Oracle Certified Associate (OCA) Java SE 7 Programmer I 认证考试(代码1Z0-803)。该指南覆盖...

    java SE基础

    1. **异常分类**:Java中的异常主要分为两大类:运行时异常(RuntimeException)和检查异常(Checked Exception)。运行时异常通常是由程序逻辑错误引起的,可以不予捕获;而检查异常必须在程序中被捕获或声明抛出。...

    Java_se基础毕向东老师全程笔记

    根据给定文件的信息,我们可以总结出“Java_SE基础毕向东老师全程笔记”中涉及的关键知识点。这份笔记由毕向东老师授课,涵盖了Java的基础知识及进阶主题,具体章节包括编程基础、数组、面向对象程序设计等多个方面...

    java se基础代码练习 Java学习资料

    - **异常类**:Java使用Exception类及其子类表示程序运行时的错误和异常情况。 - **try-catch-finally**:通过这三个块处理异常,catch捕获异常,finally确保某些代码无论如何都会执行。 - **throw和throws**:...

    JAVA SE 开发手册.CHM

    7、JAVA面向对象之三大特性 8、JAVA面向对象之函数、堆和栈、访问修饰符 9、JAVA面向对象关键字 10、JAVA面向对象抽象类abstract 11、JAVA面向对象接口interface 12、JAVA面向对象之内部类、匿名内部类 13、...

    Java SE 6 类库查询手册-带目录书签文字版

    9. **异常处理**:Java SE 6的异常处理机制强化了错误报告和处理,`Exception`类及其子类用于捕获和处理程序运行时可能出现的问题。 10. **注解(Annotation)**:Java SE 6引入了注解,这是一种元数据,可以附加到...

    Java SE 类库查询手册

    《Java SE 类库查询手册》是一本专门为Java开发者编写的详尽参考资料,旨在帮助开发者深入理解和有效利用Java标准版(Java SE)类库。这本书以中文形式呈现,使得那些英语能力有限的程序员也能轻松查阅,避免了语言...

    Oracle认证Java SE 8程序员考纲(中文版)

    ### Oracle认证Java SE 8程序员考纲解析 #### 一、Java基础知识 - **变量作用域**:理解局部变量、类变量(静态变量)的作用范围。 - **Java类的结构**:掌握类的基本组成,包括属性、方法、构造器等。 - **创建可...

    JDK API.rar_API_java api_java se api_jdk_villagesoc

    7. **异常处理**:`java.lang.Throwable`是所有异常和错误的根类,包括`Exception`和`Error`。异常处理机制通过`try-catch-finally`语句块来捕获和处理运行时问题。 8. **反射**:`java.lang.reflect`包提供了反射...

    Java SE基础.docx

    ### Java SE 基础知识点梳理 #### 一、字符串(String) **1. 字符串定义** 在 Java 中,`String` 类是最常用的字符串表示方式。`String` 类是不可变的,这意味着一旦创建了一个 `String` 对象,它的值就不能被改变...

    达内java se培训课题笔记

    这份课堂笔记主要涵盖了在达内培训期间学习的基本 Java SE 相关知识,包括但不限于 Java 的基本语法、类与对象的概念、包的使用、数据类型的转换以及一些进阶的编程技巧等。 #### 二、Java 基本概念 1. **Java ...

    Java SE面试题

    在Java中,异常分为两大类:运行时异常(`RuntimeException`)和非运行时异常(通常指的是检查型异常,`Exception`的子类但不包括`RuntimeException`及其子类)。这两类异常在处理方式上有明显的区别。 **运行时...

Global site tag (gtag.js) - Google Analytics