关闭

品味Java(6):Java的异常处理

834人阅读 评论(1) 收藏 举报
3.数据类型&运算符,表达式

  4.流程控制

  5.异常控制

  6.面向对象编程

  7.认识Java的包(Package)、标准包和Javadoc

  ……

  Java异常 (Exception) 处理

  早期的编程语言(比如C语言)没有异常处理,通常是遇到错误返回一个特殊的值或设定一个标志,并以此判断是不是有错误产生。随着系统规模的不断扩大,这种错误处理已经成为创建大型可维护程序的障碍了。于是在一些语言中出现了异常处理机制,比如在Basic中的异常处理语句“on error goto”,而Java则在C++基础上建立了新的异常处理机制。

  Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。这种机制为复杂程序提供了强有力的控制方式。同时这些异常代码与“常规”代码分离,增强了程序的可读性,编写程序时也显得更灵活。

  异常处理还有一个好处是在你不能确定和处理异常时,你可以不处理,而把问题提交上去。另一方面,异常处理机制使得错误处理代码更有条理,更便于维护。下面,我们看看在Java中如何处理异常。

  Java中的异常类

  在Java中,每个异常都是一个对象,它是Throwable类或其他子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。

  Throwable类有两个标准子类:java.lang.Error和java.lang.Exception,即错误和异常。错误(Error类)一般是指虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这一类错误无法恢复或不可能捕获,将导致应用程序中断。异常(Exception类)则是指一些可以被捕获且可能恢复的异常情况,如数组下标越界(ArrayIndexOutOfBoundsExcepton)、数字被零除产生异常(ArithmeticException)、输入/输出异常(IOException)等。

  提示:Java编译器要求Java程序必须捕获或声明所有非运行时的异常,如:FileNotFoundException、IOException等。因为,对于这类异常来说,如果程序不进行处理,可能会带来意想不到的结果。但运行时出现异常可以不做处理,因为这类异常很普遍,全部处理可能对程序的可读性和运行效率产生影响。

  Java异常处理形式

  Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

  下面是Java异常处理程序的基本形式:

  try {

  //执行时程序块

  }

  catch (ExceptionType1e){

  //对ExceptionType1的处理

  }

  catch (ExceptionType2e){

  //对ExceptionType2的处理

  throw (e);

  //再抛出这个“异常”

  }

  finally{ 

  }

  try程序块和catch语句

  遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try块内的语句都完成。如果下一级的try语句没有对某种“异常”进行处理, 堆栈就会展开,直到遇到有处理这种“异常” 的try语句。在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。

  提示:捕获异常的第一步就是用try{…}选定你要捕获异常的范围,在执行时,括号内的代码会产生异常对象并被抛出。然后你就可以用catch块来处理异常了。

  throw语句和throws语句

  throw语句用来明确地抛出一个“异常”。首先,你必须得到一个Throwable类或其他子类产生的实例句柄, 通过参数传到catch子句,或者用new语句来创建一个实例。

  下面是throw语句的通常形式:

  throw ThrowableInstance;

  提示:执行throw语句后,运行流程将立即停止,throw的下一条语句也将暂停执行。这里new运算符用于创建一个Throwable类的实例,在后文的面向对象编程一文中将详细讲解。

  throws语句用来标明一个成员函数可能抛出的各种“异常”。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的“异常”的类型。如果“异常”的类型是Error或RuntimeException,或它们的子类,这个规则不起作用。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。

  提示:当然,你可能对上面的说明不是很明白,不过不要紧,编译运行下面的Java程序(已经为你做了详细的注释)你会理解很多!

  现在我们用下面的例程来说明问题:

  class ThrowsDemo { //类名,相应的java源文件应该保存成:ThrowsDemo.java

  static void procedure( ) throws Illegal

  AccessException //throws语句

  {//抛出IllegalAccessException类型的异常

  System.out.println("inside procedure"); //输出文本信息,以说明是在执行proced

  ure方法时抛出了异常

  throw new IllegalAccessException("de

  mo"); //新生成一个Throwable类实例,然后抛出异常

  }

  public static void main(String args[]) //main()方法开始,程序从此处执行

  { try { //try语句块开始

  procedure( ); //调用procedure方法,该方法将Throw(抛出)异常信息

  }

  catch (IllegalAccessException e)

  { //处理IllegalAccessException类型的异常,catch语句块

  System.out.println("caught " + e);

  }}}

  编程并执行程序,其过程如下:

  E:/javacode/exception>java ThrowsDe

  mo

  inside procedure

  caught java.lang.IllegalAccessExceptio

  n: demo

  提示:如上面的代码所示,我们用了一个完整的程序来说明在Java程序中如何使用try…catch…throw等语句。Try{…}里产生的异常被捕获了下来,然后在catch(){}块里进行处理(这里只是输出异常信息)。throws IllegalAccessException标明程序将抛出一个IllegalAccessException类型的异常。IllegalAccessException e生成一个异常对象,然后用System.out.println输出异常信息。

  finally语句

  有时为了确保一段代码不管发生什么异常都要被执行,可以使用关键词finally来标出这样一段代码。一个成员函数返回到调用它的成员函数,或者通过一个没捕捉到的异常,或者通过一个明确的return语句,finally子句总是恰好在成员函数返回前执行。

  下面我们以一个比较完整的异常处理程序来说明上面所述的各种异常处理语句的使用问题:

  class ExceptionDemo { //异常使用示例,保存为ExceptionDemo.java

  static void procA( )

  {

  try{

  System.out.println("inside procA");

  throw new RuntimeException("demo")

  ;}//抛出异常

  finally {

  System.out.println("procA's finally"); }}//注意:不管发生什么等会执行!!

  static void procB( )

  { try {

  System.out.println("inside procB");

  return;} //返回,实际上是在finally语句执行完后才返回

  finally {

  System.out.println("procB's finally");}}

  public static void main(String args[])

  { try{

  procA();}

  catch(Exception e){

  System.out.println("catch:"+e);}

  procB(); }}

  提示:在上面的完整程序中,finally后的大括号内的代码是任何情况下都会执行的。另外,在procB( )中,return;语句并没有立即返回,这一点应该特别注意。你可以亲自动手,执行上面的程序试试(编译和执行类似于上例)?

  到目前为止,关于Java的流程控制已经完全讲完了。要真正理解并掌握它们只有经过大量的练习。而好的方法就是修改上面的每一个程序,让它们实现你想要的功能,并在此基本上理解Java的流程控制。而要写好Java程序,熟悉使用Java的流程控制和异常处理是非常关键的。所以在这两期中,我们用大量的例程来说明Java语言是如何使用流程控制语句的,并且对流程控制中经常使用的异常处理语句做了简单的介绍。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

品味Java(6):Java的异常处理

Java异常 (Exception) 处理   早期的编程语言(比如C语言)没有异常处理,通常是遇到错误返回一个特殊的值或设定一个标志,并以此判断是不是有错误产生。随着系统规模的不断扩大,这种错误处理已经成为创建大型可维护程序的障碍了。于是在一些语言中出现了异常处理机制,比如在Basic中的异...
  • wuhao0420wuhao
  • wuhao0420wuhao
  • 2013-03-26 18:17
  • 285

《品味大数据》之序言

【作者按】写了一年多,流了一堆汗,拙作《品味大数据》终于在亚马逊、京东和当当网等网店上线了。作为小人物,写了本关于大数据的科普读物,虽不免于被大家们所不屑,但这本小书,也见证了我一年多的思考与成长历程,我思故我在嘛,值得纪念一下,特把图书的序言发表于此,如同一些大煞风景的游客,在建筑物上刻着“xxx...
  • yhily2008
  • yhily2008
  • 2016-10-29 17:27
  • 1759

品味Java:爱上你 爱上Java

现在,Java技术已经风靡全球,就连环球信息网WWW的创始人也说:“计算机行业发展的下一个浪潮就是Java,并且很快就会发生。”SUN公司也声称,J2EE 1.4代表了“迄今为止最完美的网络服务平台”。 Warton   现在,Java技术已经风靡全球,就连环球信息网WWW的创始人也说:“计算机...
  • luke_wang
  • luke_wang
  • 2014-12-12 17:43
  • 256

java5、java6、java7、java8的新特性

Java5: 1、泛型 Generics:         引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。      &...
  • qq_30641447
  • qq_30641447
  • 2015-11-15 21:58
  • 8456

Java的日期与时间(六)java.sql.Timestamp

Java的日期与时间原文链接 作者:Jakob Jenkov 译者:阿为 目录:http://blog.csdn.net/tjgykhulj/article/details/68952451 (所有译者备注将以此形式出现,删除线表示有争议或不明确的地方)(你会发现这一章有非常多内容同上一章相...
  • tjgykhulj
  • tjgykhulj
  • 2017-04-02 19:16
  • 740

Mac OS 您需要安装旧 Java SE 6 Runtime运行环境才能打开“XXX” 问题

Mac OS 您需要安装旧 Java SE 6 Runtime运行环境才能打开“XXX” 问题 问题描述: 今天在Mac OS上安装一个app的时候提示 “您需要安装旧 Java SE 6 运行环境才能打开 XXX” ,在网上搜索了一下,有说要改app的info.plist文件的,将其中的JVMV...
  • u013007305
  • u013007305
  • 2017-05-06 12:05
  • 992

Java中异或的学习

异域的概念是相同为0不同为1.如果两个数值异或后的值相同,异或前可能不同。
  • u010604293
  • u010604293
  • 2015-12-05 14:58
  • 2536

JAVA EE 6 规范综述

1.JAVA EE规范综述 JAVA EE是作为JAVA语言的企业级规范进行指定的,其目的是满足于行业软件的企业的应用的需求,在复杂的业务逻辑的前提下,尽可能将屏蔽网络,硬件等复杂的设施,将这些内容转嫁给一些实现了部分JAVA EE规范服务的供应商或者完全实现JAVA EE规范的应用服务器厂商和来...
  • yuantongaaa
  • yuantongaaa
  • 2014-11-06 22:08
  • 1138

Java 习题6 参考答案及解析

1.问答题 接口中能声明变量吗? 接口中能定义非抽象方法吗? 什么叫接口的回调? 接口中的常量可以不指定初值吗? 可以在接口中只声明常量,不声明抽象方法吗? 问答题解析 不能。 不能。 可以把实现某一接口的类,所创建的对象的引用,赋给该接口声明的接口变量中。那么该接口变量就可以调...
  • Rainary
  • Rainary
  • 2017-06-15 09:40
  • 3284

[深入理解Java虚拟机]第一章实战 自己编译JDK

实战:自己编译JDK想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK ,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛会高一点,但肯定会比阅读各种书籍、文章更加贴近本质。另外,JDK中的很多底层方法都是本地化( Native ) 的 ,需要跟踪这些方法的运作或...
  • qilixiang012
  • qilixiang012
  • 2015-10-03 22:38
  • 3428
    个人资料
    • 访问:3389017次
    • 积分:29813
    • 等级:
    • 排名:第200名
    • 原创:347篇
    • 转载:561篇
    • 译文:7篇
    • 评论:341条
    最新评论
    艺术设计类