星期一, 十月 09, 2006

20061009:java异常处理的笔记

今天上午看孙卫琴的"java 面向对象编程"中的异常处理章节.

一.java异常类:
1.Throwable是所有异常类的根类.下面有两格直接子类:Error和Exception.
Error表示程序本身无法恢复的严重错误,比如内存不足等.
Exception表示程序本身还可以处理的异常.

2.Exception的子类可以分为两类:运行时异常和受检查异常.
2.1运行时异常(RuntimeException)
此类异常java编译不会检查,当程序中可能出现这种异常,既没有用try ...catch去捕捉,也没有throws声明抛出,还是会通过java编译器的编译的.比如
public class WithRuntimeEx{
public int divide(int a,int b){
if(b==0) throw new IllegalArgumentException("除数不能为0!");
return a/b;
}
public static void main(String[] args){
new WithRuntimeEx().divide(1,0);
System.out.println("End");
}
}
上面的代码执行的结果是:
Exception in thread "main" java.lang.IllegalArgumentException:除数不能为0!
at WithRuntimeEx.divide(WithRuntimeEx.java:3)
at WithRuntimeEx.main(WithRuntimeEx.java:7)

2.2受检查异常
出去RuntimeException及其子类之外的所有异常,都属于受检查异常(Checked Exception).他们会被java编译器检查出来.因此在程序中要么用try...catch捕获,要么用throws声明并抛出.

2.3RuntimeException(及其子类)和Error(及其子类)的区别:
两者相同点:java编译器都不会检查他们
两者区别:Error由java虚拟机抛出,应用程序一般不扩展Error类.RuntimeException由应用程序抛出.可以扩展.

二.Java异常处理机制
1.java虚拟机的方法调用栈(method invocation stack)
java虚拟机的方法调用栈用来跟踪每个线程中一系列的方法调用过程.该堆栈保存了每个调用方法的本地信息(比如方法的局部变量).每个线程都有独立的方法调用栈.对于主线程,堆栈的底部是程序的入口方法main().当新调用一个方法时,java虚拟机把该方法的栈结构置入栈顶.当该方法执行完毕后,java虚拟机会从调用栈中弹出该方法的栈结构.然后处理此刻的方法(即调用刚才被弹出方法的方法).
当方法中出现异常的时候,有两种处理方法:
a.在当前方法中通过try...catch来捕获并处理异常.
b.在方法的声明处通过throws声明抛出异常.如
public void methodA(int money) throws SpecialException{
//以下代码可能抛出SpecialException
if(--money<=0) throw new SpecialException("Out of money");
}

2.运用java异常处理机制
java异常处理机制的关键字:try catch finally throw throws
a.finally是在任何情况下都要执行的语句,除非System.exit(),或者断电.
b.finally中不要使用return.否则可能覆盖try...catch中的return值,或者丢失异常.
c.异常处理的一个基本点是自己能处理的异常自己处理,自己不能处理的则抛出.
d.throw和throws的区别:如果一个方法可能出现异常,但没有能力处理这种异常,则在方法声明处用throws来抛出异常;throw则是用来抛出异常.

三.异常处理原则:
1.异常只能用于非正常情况
2.为异常提供文档
3.尽可能避免异常
4.保持异常的原子性
5.避免过于庞大的try代码块
6.在catch中指定具体的异常类型
7.不要在catch代码块中忽略被捕获的异常


四.其它
异常链
处理多样化异常

没有评论: