首页 > 代码库 > 异常与调试
异常与调试
在Java中,异常对象都是派生于Throwable类的一个实例。
派生于RuntimeException类或者Error类的所有异常称为【未检查异常】,其他的异常称为【已检查异常】。
Error类描述Java运行时系统的内部错误和资源耗尽错误;
派生于RuntimeException的异常包括:错误的类型转换;数组越界访问;访问空指针。
不是派生于RuntimeException的异常包括:试图在文件尾部后面读取数据;试图打开一个格式错误的URL;试图根据给定的字符串查找Class对象,而这个字符串表示的类不存在。
在自己编写方法时,需要记住遇到下面4中情况时才会抛出异常:
1)调用一个抛出已检查异常的方法;
2)在程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常;
3)程序出现错误;
4)Java虚拟机和运行时库出现的内部异常。
如果一个方法有可能抛出多个已检查异常,就必须在方法的首部列出所有的异常类。每个异常类之间用逗号隔开。
不需要声明从Error继承的那些异常,任何程序代码都有抛出这类异常的能力,而我们对他们没有任何控制能力。
同样,也不应该声明从RuntimeException继承的那些未检查异常。这些运行时错误完全在我们的控制之下,应该多花时间修正程序的错误,而不是说明这种错误发生的可能性。
如果在子类中覆盖了超类的一个方法,那么子类方法中声明的已检查异常不能超过超类方法中声明的异常范围。特别是,如果超类没有抛出任何已检查异常,那么,子类也不能抛出任何已检查异常。
假设一个名为readData的方法正在读取一个首部具有下列信息的文件:Content-length:1024,然而,读到733个字符之后文件就结束了,此时,我们认为这是一种非正常的情况,希望抛出一个异常。
查看Java API文档后发现:EOFException异常的描述是:在输入过程中,遇到一个未预期的EOF后的信号。这正是我们要抛出的异常。
String readData(Scanner in) throws EOFException{ ... while(...) { if(!in.hasNext()) //EOF encountered { if(n<len) throw new EOFException(); } ... } return s;}
综上,抛出一个已经存在的异常类是很容易的:
1)找到一个合适的异常类;
2)创建这个类的一个对象;
3)将对象抛出。
有时候,找不到合适的已存在异常类,就需要我们自己创建异常类了。我们要做的是定义一个派生于Exception的类,或者派生于Exception子类的类。习惯上,定义的类应该包括两个构造器:一个是默认的构造器,一个是带有详细描述信息的构造器。
class FileFormatException extends IOException{ public FileFormatException(){} public FileFormatException(String gripe) { super(gripe); }}//现在,就可以抛出自己定义的异常类型了String readData(BufferedReader in) throws FileFormatException{ ... while(...) { if(ch == -1) //EOF encountered { if(n < len) throw new FileFormatException(); } ... } return s;}
异常与调试