第11章 异常、断言、日志和调试

来源:互联网 发布:天策雪河军爷捏脸数据 编辑:程序博客网 时间:2024/06/05 17:17

1.处理错误

如果由于出现错误而使得某些操作没有完成,程序应该:
·返回到一种安全状态,并能够让用户执行一些其他的命令;或者
·允许用户保存所有操作的结果,并以适当的方式终止程序。
程序中可能会出现的问题:
(1)用户输入错误
(2)设备错误
(3)物理限制
(4)代码错误

1.1 异常分类

Java异常层次结构的一个简化图。

在Java程序设计语言中,异常对象都是派生于Throwable类的一个实例。
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。
由程序错误导致的异常属于RuntimeException。派生于RuntimeException的异常包含:
·错误的类型转换
·数组越界访问
·访问空指针
程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。不是派生于RuntimeException的异常包括:
·试图在文件尾部后面读取数据
·试图打开一个不存在的文件
·试图根据给定的字符串查找Class对象,而这个字符串表示的类不存在。
如果出现RuntimeException异常,那么一定是你的问题。

1.2 声明已检查的异常

throws关键字
应该抛出异常的情况:
(1)调用一个抛出已检查异常的方法,例如,FileInputStream构造器。
(2)程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常。
(3)程序出现错误。
(4)Java虚拟机和运行时库出现的内部错误。
不要声明Java内部的错误,即从Error继承的错误,也不应该声明从RuntimeException继承的那些未检查异常。
警告:如果在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常不能比超类方法中声明的异常更通用(子类方法可以抛出更特定的异常,或者不抛出任何异常)。如果超类方法没有抛出任何已检查异常,子类也不能抛出任何已检查异常。


1.3 如何抛出异常

throw关键字
(1)找到一个合适的异常类
(2)创建这个类的一个对象
(3)将对象抛出
String readData(Scanner in) throws EOFException{        ...        while(...){                if(!in.hasNext()){ //EOF encountered                        if(n<len)                                throw new EOFException();                }                ...        }        return s;}


1.4 创建异常类

class FileFormatException extends IOException{        //习惯上定义的类包含两个构造器,一个默认构造器,一个带有详细描述信息的构造器        public FileFormatException(){}        public FileFormatException(String gripe){ //超类Throwable的toString方法将会打印gripe                super(gripe);        }}

2.捕获异常

2.1 try/catch/finally

Java中try,catch,finally的用法

2.2 再次抛出异常与异常链

在catch语句中可以抛出一个异常,这样做的目的是改变异常的类型。
try{        access the database}catch(SQLException){        throw new ServletException("database error:"+e.getMessage());}
//将原始异常设置为新异常的“原因”
try{        access the database}catch(SQLException){        Throwable se=new ServletException("database error");        se.initCause(e);        throw se;}
//重新得到原始异常
Throwable e=se.getCause();

3.使用异常机制的技巧

(1)异常处理不能代替简单的测试
(2)不要过分的细化异常
(3)利用异常层次结构
不要只抛出RuntimeException异常,应该寻找更加适当的子类或创建自己的异常类。
不要只捕获Throwable异常,否则会使程序代码更难读、更难维护。
考虑已检查异常和未检查异常的区别。不要为逻辑错误抛出已检查异常。
将一种异常转换为另一种更加合适的异常时不要犹豫。
(4)不要压制异常
(5)在检测错误时,苛刻要比放任更好
(6)不要羞于传递异常
5,6可归纳为“早抛出,晚捕获”。

4.使用断言

Java陷阱之assert关键字

5.Junit

Junit使用教程
原创粉丝点击