Java中的异常处理
 
1Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

2)当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。

 

3)如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。

 

4)对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。

 

5)派生类构造方法的异常说明必须包含基类构造方法的异常说明,即派生类构造方法的异常必须为基类异常或其父类,当基类构造方法没有异常时,派生类构造方法也可以异常声明。注意,派生类构造器不能捕获基类构造方法抛出的异常。

 

6)派生类方法可以不抛出异常,即使基类有异常说明,如果派生类方法有异常说明,必须是基类异常或其子类,而且当基类没有异常声明时,派生类方法不允许异常声明(关于构造方法见5中的说明)。

 

7)我们可以在方法声明时,声明一个不会抛出的异常,Java编译器就会强迫方法的使用者对异常进行处理。这种方式通常应用于abstract classinterface中。

 

显示异常

catch(Exception e) {
       System.out.println(e.getMessage());  //获取异常信息
    System.out.println(e.toString);  //返回简短的描述信息
    e.printStackTrace();  //发生异常的位置
       }

 

抛出异常throw

当抛出异常后。首先,同Java中其他对象的创建一样,将使用new在堆上创建异常对象。然后,当前的执行路径被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。这个恰当的地方就是“异常处理程序”,它的任务是将程序从错误状态中恢复,以使程序能换一种方式运行,或者继续运行下去。
举一个抛出异常的简单例子。对于对象引用t,传给你的时候可能尚未被初始化。所以在使用这个对象引用调用其方法之前,会先对引用进行检查。可以创建一个代表错误信息的对象,并且将它从当前环境中“抛出”,这样就把错误信息传播到了“更大”的环境中。这被称为“抛出一个异常”。
if(t==null)
  throw new NullPointerException();

 

异常参数

所有标准异常类都有两个构造器:一个是缺省构造器;另一个是接受字符串作为参数,以便能把相关信息放入异常对象的构造器:
throw new NullPointerException(“t=null”);

 

捕获异常try-catch

如果在方法内部抛出了异常(或者在方法内部调用的其他方法抛出了异常),这个方法将在抛出异常的过程中结束。要是不希望就此结束,可以在方法内设置一个特殊的块来捕获异常。这个块就是try块。
try{
  //Code that might generate exceptions
}
抛出的异常必须在某处得到处理,以catch子句的形式处理。

 

异常说明throws

“异常说明”告知了客户端某个方法可能会抛出的异常类型。它属于方法声明的一部分,紧跟在形式参数列表之后。
void f() throws Exception1,Exception2{...}
代码必须与异常说明保持一致。如果方法里的代码产生了异常却没有进行处理,编译器会发现这个问题并提醒你:要么处理这个异常,要么就在异常说明中表明此方法将产生异常。
使用eclipse时,会有相应的提示:
1Add throws declaration
2Surround with try/catch
所以可以这么理解异常说明,一个方法碰到一个自己无法处理的错误时,需要在方法头声明它可能会抛出的异常("已检查异常")。以下四种情况会抛出异常:
-调用了一个会抛出"已检查异常"的方法。
-程序运行过程中发生了错误,并且用throw语句抛出一个"已检查异常"
-程序错误。
-Java虚拟机或者运行时库出现了内部错误。
前两种情况需要在方法中使用throws语句声明,以告诉调用该方法的程序员,可能碰到的"已检查异常"(即,一个方法必须声明它可能抛出的全部"已检查异常")。通过捕获异常,就可以使方法不会将异常抛出,从而不需要使用throws字句。通常,应捕获并且处理那些已知如何处理的异常,而传递那些不知如何处理的异常。

 

重新抛出异常throw

有时希望把刚捕获的异常重新抛出。
catch(Exception e){
  System.err.println(“An Exception was thrown”);
  throw e;
}
重新抛出异常会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略。

 

Java标准异常

Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型(指从Throwable继承而得到的类型):Error用来表示编译时和系统错误;Exception是可以被抛出的基本类型、在Java类库、用户方法以及运行时故障都可能抛出Exception异常。
Java异常类的结构:
  Throwable
   |____Error
   |____Exception
         |____RuntimeException
         |____其它Exception
  Error:Java运行系统中的内部错误以及资源耗尽的情况。
  Exception:RuntimeException及其子类(编程导致的异常)、其它Exception类。

 

关于RuntimeException

RuntimeException(或任何从它继承的异常),对于这种异常类型,编译器不需要异常说明。注意,只能在代码中忽略RuntimeException(及其子类)类型的异常,其他类型异常的处理都是由编译器强制实施的。

 

关于finally

对于一些代码,可能会希望无论try块中的异常是否抛出,它们都能得到执行。为了达到这一效果,可以在异常处理程序后面加上finally子句。
示例1
方法{
  try{
  ……..
  return;//加此条语句
  }
  catch(Exception e){
  }
  finally{
  ……….//会执行
  }
  ……….//不会执行

 

}
示例2
方法{
  try{
  ……..
  System.exit(-1);//终止运行
  }
  catch(Exception e){
  }
  finally{
  ……….//不会执行
  }
  ……….//不会执行

 

}

 

参考资料

[1]Thinking in Java3rd
[2]孙鑫视频
[3] Java中的异常处理
[4] Java中的异常处理框架
[url]http://blog.csdn.net/flowing/archive/[/url]<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2006/04/18/668440.aspx