MDA之路

MDA,UML,XML,Eclipse及Java相关的Blog
posts - 53, comments - 494, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java语言的异常类使用讨论

Posted on 2005-03-02 15:40 wxb_nudt 阅读(1299) 评论(1)  编辑  收藏 所属分类: 技术杂谈

    Java异常的语法应该是很简单的,一个try,catch,finally,一个throws,throw,两分钟就可学完了。我相信许多人和我一样,对于异常是这样处理的:
1.写程序时就等编译器检查,一旦通不过就加try,catch;
2.自己抛异常常常忘了在方法声明时加throws,而且又不明白为什么有的异常需要throws,而有的又不需要;
3.从来不写自己的异常类;
4.catch到异常不知道怎么办,通通加一行printStackTrace拉倒;
如果属于以上这几种情况的,我觉得有必要和我一起讨论一下Java的异常使用方法。

    查阅资料可以得知,Java最主要的异常类包括4种:Throwable、Error、Exception和RuntimeException;其中Throwable是所有异常类的父类,它继承Object类并实现Serializable接口;Error和Exception都是Throwable的子类;而RuntimeException是Exception的子类。Exception的子类非常多,但是RuntimeException是一个特殊的子类,需要单独讨论。
    一般当程序员在某个方法中抛出一个Exception异常(或者其子类)时,需在方法头部声明此方法抛出了一个异常,就是用throws关键字来声明;但是如果在方法中抛出一个RuntimeException或者一个Error时,则不需要声明此方法抛出了异常,这是为什么呢?
    语法上的约束必然有其背后的道理;如果不去弄明白这些道理而是一味的依赖编辑器来帮忙,则事倍功半。事实上,Java语言的这种语法含义是:Java编译器要求Java程序必须捕获或声明所有非运行时的异常,也就是说,Exception异常是需查异常,必须由程序员对它严格的负责,如果在方法中抛出,必须声明,如果抛出的异常没有被catch,则会出现语法错误,编译都不能通过。这是强制性的让程序员遵守Java的异常规则。这样规定的原因是当Exception异常出现时,运行的程序还有补救的余地,通过异常处理代码,可以让程序恢复运行,如果不捕捉这种异常,则白白浪费了补救程序的机会。而且,这种异常应让程序员可见,所以必须在方法头部声明此方法抛出了某种Exception异常。
    那么,Error和RuntimeException都是不需查异常,在方法中抛出这两种异常都不需要声明,在程序中不catch它们也不会造成语法错误。我的理解是,当出现这样的异常时,运行的程序已经没有补救的余地了,于是直接抛出异常让程序结束是比较合理的安排。如果在程序运行时出现了Error或者RuntimeException,那么程序员也无能为力,所以它们可以对程序员透明,也不需要特意声明让程序员来处理它们。
    现在我们知道,try和catch一般对Exception及其子类使用,throws也是。而对于Error和RuntimeException则不需要throws,不过还是可以catch的,但是catch到它们一般也就是释放资源,退出程序而已。
    对于catch到的异常的处理,最经常犯的错误就是丢失异常,catch到旧的异常抛出新的异常,等到程序出错时就找不到旧异常的信息了。其实JDK1.4已经提供了这个问题的解决方案,就是用Exception的构造函数形成异常链,用旧异常作为参数构造新异常,这样就可以在出错时一步步跟踪到所有出现过的异常了,这两个构造函数就是:
    public Exception(String message, Throwable cause) {
    super(message, cause);
    }
    public Exception(Throwable cause) {
        super(cause);
    }
    就想到这么多,以后有了新体会再续。


评论

# re: Java语言的异常类使用讨论  回复  更多评论   

2006-10-18 09:25 by jj
请问:
如何设计一个复数类,并在其中的没个成员方法中检测可能出现的各种异常?
谢谢解答!

只有注册用户登录后才能发表评论。


网站导航: