`
wenjinglian
  • 浏览: 810118 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

Java语言中的两种异常

    博客分类:
  • JAVA
阅读更多

Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 

   它们的不同之处表现在两方面:机制上和逻辑上。 
   一、机制上 

   它们在机制上的不同表现在两点:1.如何定义方法;2. 如何处理抛出的异常。请看下面

CheckedException的定义:

 public class CheckedException extends Exception { 
   public CheckedException() {} 
   public CheckedException( String message ){ 
            super( message ); 
   } 
}

 以及一个使用exception的例子:

public class ExceptionalClass{ 

   public void method1() throws CheckedException { 
    // ... 
          throw new CheckedException( "...出错了" ); 
   } 
   public void method2( String arg ) { 
    if( arg == null ) 
    { 
     throw new NullPointerException( "method2的参数arg是null!" ); 
    } 
   } 
   public void method3() throws CheckedException{ 
    method1(); 
   }   
}  

 你可能已经注意到了,两个方法method1()和method2()都会抛出exception,可是只有method1()做了声明。另外,method3()本身并不会抛出exception,可是它却声明会抛出CheckedException。在向你解释之前,让我们先来看看这个类的main()方法:

public static void main( String[] args ) 
   { 

   ExceptionalClass example = new ExceptionalClass(); 
   try 
   { 
      example.method1(); 
      example.method3(); 
   }  catch( CheckedException ex ) { 

       } 
        example.method2( null ); 
} 

 在main()方法中,如果要调用method1(),你必须把这个调用放在try/catch程序块当中,因为它会抛出Checked exception。 

   相比之下,当你调用method2()时,则不需要把它放在try/catch程序块当中,因为它会抛出的exception不是checked exception,而是runtime exception。会抛出runtime exception的方法在定义时不必声明它会抛出exception。 

   现在,让我们再来看看method3()。它调用了method1()却没有把这个调用放在try/catch程序块当中。它是通过声明它会抛出method1()会抛出的exception来避免这样做的。它没有捕获这个exception,而是把它传递下去。实际上main()方法也可以这样做,通过声明它会抛出Checked exception来避免使用try/catch程序块(当然我们反对这种做法)。 

   小结一下:

1、 Runtime exceptions: 

   在定义方法时不需要声明会抛出runtime exception; 

   在调用这个方法时不需要捕获这个runtime exception; 

   runtime exception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 

    2、 Checked exceptions: 

   定义方法时必须声明所有可能会抛出的checked exception; 

   在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去; 

   checked exception是从java.lang.Exception类衍生出来的。 

   二、逻辑上 

   从逻辑的角度来说,checked exceptions和runtime exception是有不同的使用目的的。checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。 

   checked exception迫使你捕获它并处理这种异常情况。以java.net.URL类的构建器(constructor)为例,它的每一个构建器都会抛出MalformedURLException。MalformedURLException就是一种checked exception。设想一下,你有一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。如果用户输入的URL有错误,构建器就会抛出一个exception。既然这个exception是checked exception,你的程序就可以捕获它并正确处理:比如说提示用户重新输入。

 

再看下面这个例子:

public void method() 
   { 

   int [] numbers = { 1, 2, 3 }; 
   int sum = numbers[0] + numbers[3]; 
} 

 在运行方法method()时会遇到ArrayIndexOutOfBoundsException(因为数组numbers的成员是从0到2)。对于这个异常,调用方无法处理/纠正。这个方法method()和上面的method2()一样,都是runtime exception的情形。上面我已经提到,runtime exception用来指示一种调用方本身无法处理/恢复的程序错误。而程序错误通常是无法在运行过程中处理的,必须改正程序代码。 

   总而言之,在程序的运行过程中一个checked exception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。而对于runtime exception,则不应当在程序中捕获它。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。因为在程序测试过程中,系统打印出来的调用堆栈路径(StackTrace)往往使你更快找到并修改代码中的错误。有些程序员建议捕获runtime exception并纪录在log中,我反对这样做。这样做的坏处是你必须通过浏览log来找出问题,而用来测试程序的测试系统(比如Unit Test)却无法直接捕获问题并报告出来。 

   在程序中捕获runtime exception还会带来更多的问题:要捕获哪些runtime exception?什么时候捕获?runtime exception是不需要声明的,你怎样知道有没有runtime exception要捕获?你想看到在程序中每一次调用方法时,都使用try/catch程序块吗?

分享到:
评论

相关推荐

    Java精华(免费版)

    1.1.1.3Java语言中两种异常的差别 Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang....

    Java论文异常处理论文:JAVA异常处理的分析与研究.doc

    4. Java 异常处理的方法有两种基本思路:通过对 try-catch-finally 语句的使用实现对异常情况的处理,和通过 throws 语句执行的不在产生异常的方法中处理异常的一种方法。 通过本文的研究和分析,我们可以更好地...

    java 异常处理ppt

    深刻理解 java 语言中独特的异常处理机制,掌握处理问题的方法。异常处理是java语言中一个独特之处,主要使用捕获异常和声明抛弃异常两种方法来处理程序中可能出现异常的语句块。

    JSTL详细标签库介绍

    target=_blank>浅析Java语言中两种异常使用的差别</A> <LI><A title=邂逅StringIndexOutOfBoundsException href="http://www.jspcn.net/htmlnews/11171163972961452.html" target=_blank>邂逅...

    Java中高级核心知识全面解析.pdf

    * Java 中的 I/O 流分为两种:字节流和字符流。 * BIO、NIO、AIO 是 Java 中的 I/O 模式。 五、ArrayList 5.1 ArrayList 简介 * ArrayList 是一个动态数组,提供了对数组的操作方法。 5.2 ArrayList 核心源码 *...

    Java异常处理机制的静态编译实现与优化

    作为两款被广泛使用的面向对象语言,C++和Java语言都支持异常处理机制。异常处理机制通常由编译器和异常处理机制的运行时支持函数共同实现,因此,如何正确高效地实现异常处理机制是设计编译器和异常处理运行时支持函数...

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    Java面试宝典V8.0-V001(1).pdf

    1. Java中的异常类型:Java中有两种异常类型:checked异常和unchecked异常。checked异常是编译器强制要求捕获的异常,而unchecked异常是运行时异常。 2. Java中的try-catch块:try-catch块是Java中的异常处理机制。...

    Java语言基础下载

    创建线程的两种方式 179 线程的控制 180 实例分析 182 内容总结 189 独立实践 190 第十二章:高级I/O流 192 学习目标 192 I/O基础知识 193 字节流 193 字符流 194 节点流 194 过程流 194 基本字符流类 198 对象串行...

    java经典选择题题库及答案.docx

    在Java语言中,源程序保存时的文件扩展名是.java。Java语言是Sun Microsystems公司开发的一种面向对象的程序设计语言。Java语言的主要特点是平台无关性、对象 Orientation、分布式性、多线程、动态加载类库等。 ...

    《JAVA程序设计》期末考试试题_(三).

    本文档总结了JAVA程序设计期末考试试题(三),涵盖了JAVA语言的基础知识点,包括标识符、关键字、变量、数据类型、运算符、控制流程、数组、字符串、异常处理等。 一、单项选择题 1. 在 Java 中,标识符可以是...

    Java 1.6 API 中文 New

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    Java异常详解

    Java 异常是 Java 语言中一种特殊的事件,它可以在程序执行过程中发生,导致程序的非正常终止。Java 异常可以分为两大类:Checked Exception 和 Runtime Exception。 Checked Exception 是编译器在编译过程中检查的...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

    JavaAPI1.6中文chm文档 part1

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    《Java语言程序设计》课程教学设计方案.doc

    "3 "1 " " " " "第 1 章 Java语言概述 " " " " " " "第 2 章 "3 "1 " " " " "Java开发环境基本知识 " " " " " " "第 3 章 Java语言基础 "3 "2 " " " " "第 4 章 面向对象的程序设计"3 "3 " " " " "第 5 章 异常处理 ...

    100家大公司java笔试题汇总.docx

    2. Java中的异常可以分为两种:checked exception和unchecked exception,checked exception需要在方法声明中throws,unchecked exception不需要。 3. Java中的finally块总是会被执行,哪怕try块中抛出异常也一样。 ...

    Java程序设计课程学习总结与心得

    本文将从 Java 语言的基础知识到高级部分的总结,涵盖面向对象编程、数组、字符串、流技术、异常处理等内容,并对_java 语言的特点和编程规范进行了总结和分析。 Java 语言的基础知识 Java 语言和 C 语言有许多...

Global site tag (gtag.js) - Google Analytics