异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器
1.异常分类:
所有的异常都是由Throwable继承而来,一下层分为Error和Exception
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象
在设计Java程序时,需要关注Exception层次结构,这个层次分为两个分支:一个分支派生于RuntimeException,另一个分支包含其他异常。由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常
派生于RuntimeException的异常包含下面几种情况:
1)错误的类型转换
2)数组访问越界
3)访问null指针
不是派生于RuntimeException的异常包括:
1)试图在文件尾部后面读取数据
2)试图打开一个不存在的文件
3)试图根据给定字符串查找Class对象,而这个字符串表示的类并不存在
综上,可以就看出,RuntimeException是不应该出现的错误
Java语言规范将派生于Error类和RuntimeException类的所有异常称为非受查异常,所有其他的异常称为受查异常。编译器将核查是否为所有的受查异常提供了异常处理器
2.声明受查异常:
方法应该在首部声明所有可能抛出的异常,例如:
public FileInputStream(String name) throws FileNotFoundException
注意:
如果方法没有声明所有可能发生的受查异常,编译器就会发出一个错误消息
如果子类中覆盖了超类的一个方法,子类方法中声明的受查异常不能比超类方法中的声明的异常更通用
3.如何抛出异常:
throw new EOFException();
或者
EOFException e = new EOFException();
throw e;
例如:
String readData(Scanner in) throws EOFException{
...
while(...){
if(!in.hasNext()){
if(n<len)
throw new EOFException();
}
...
}
return s;
}
可以看出对于一个已经存在的异常类,将其抛出非常容易:
1)找到一个合适的异常类
2)创建这个类的一个对象
3)将对象抛出
4.创建异常类:
习惯上,定义的类应该包含两个构造器,一个是默认的构造器;另一个是带有详细描述信息的构造器(超类Throwable的toString方法将会打印出详细信息)
例如:
class FileFormatException extends IOException{
public FileFormatException(){}
public FileFormatException(String gripe){
super(gripe);
}
}
5.java.lang.Throwable 1.0:
Throwable()
构造一个新的Throwable对象,这个对象没有详细的描述信息
Throwable(String message)
构造一个新的Throwable对象,这个对象带有特定的详细描述信息
String getMessage()
获得Throwable对象的详细描述信息