如果遇到了无法处理的情况,那么Jeva的方法可以抛出一个异常。 这个道理很简单,个方法不仅需要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误。例如,一段读取文件的代码知道有可能读取的文件不存在,或者内容为空,因此,试图处理文件信食的代码就需要通知编译器可能会抛出IOException类的异常。
方法应该在其首部声明所有可能抛出的异常。这样可以从首部反映出这个方法可能抛出电些受查异常。例如,下面是标准类库中提供的FilelnpuSteam类的一个 构造器的声明。
public FileInputStream(String name) throws FilelotFoundException
这个声明表示这个构造器将根据给定的String参数产生一个FileInputStream对象,但也七可能抛出一个FileNotFoundException异常。如果发生了这种糟糕情况,构造器将不会初始个新的Fielnputramn对象,而是抛出一个FleNotFoundExcepion类对象。 如果这个方化直的抛出了这样一个异常对象,运行时系统就会开始搜索异常处理器,以便知道如何处理FileNotFoundException对象。
在自己编写方法时,不必将所有可能抛出的异常都进行声明。至于什么时候需要在方法JotFoundException对象。中用throws子句声明异常,什么异常必须使用hrows子句声明,需要记住在遇到下面4种情况时应该抛出异常:
1)调用一个抛出受查异常的方法,例如,Flcepusre构造器。
2)程序运行过程中发现错误,并且利用throwi语句抛出一一个受直异常
3)程序出现错误,例如,a-1-0非受查异常。会抛出一个AraylndexOutOBoudException这样的费受查异常。
4) Java虚拟机和运行时库出现的内部错误。
这个方法的程序员有可能抛出异常。为什如果出现前两种情况之一,则必须告诉调用这用不死亡陷阱、如果没有处理器捕获这个异么?因为任何一个抛出异常的方法都有可能是一个死亡陷阱。如果没有处理器捕获这个异常,当前执行的线程就会结束。 对于那些可能被他人使用的Java方法,应该根据异常规范( exception specification), 在方法的首部声明这个方法可能抛出的异常。
class MyAnimation、
{
public Image loadImage(String s) throws IOException
{
......
}
}
如果一个方法有可能抛出多个受在异常类型,那么就必须在方法的首部列出所有的异常类。每个异常类之间用逗号隔开。如下面这个例子所示:
class MyAnimation
{
.........
public Image 1oadImage(String s) throws FileWotFoundException, E0FException
{
.........
}
}
但是,不需要声明Java的内部错误,即从Eror继承的错误。任何程序代码都具有抛出那些异常的潜能,而我们对其没有任何控制能力。
同样,也不应该声明从RuntimeException继承的那些非受查异常。
class MyAnimation
{
.....
void drawImage(int i) throws ArrayIndexOutOfBoundsExcepton // bad stile
{
......
}
}
这些运行时错误完全在我们的控制之下。如果特别关注数组下标引发的错误,就应该将更多的时间花费在修正程序中的错误上,而不是说明这些错误发生的可能性上。
总之,一个方法必须声明所有可能抛出的受查异常,而非受查异常要么不可控制( Error).要么就应该避免发生( RuntimeException)。如果方法没有声明所有可能发生的受查异常,编译器就会发出一个错误消息。
当然,从前面的示例中可以知道:除了声明异常之外,还可以捕获异常。这样会使异常不被抛到方法之外,也不需要throws规范。稍后,将会讨论如何决定一个异 常是被捕获,还是被抛出让其他的处理器进行处理。
注意:
如果在子类中覆盖了超类的一个方法。 子类方法中声明的受查异常不能比超类方法中声明的异常更通用(也就是说,子类方法中可以抛出更特定的异常,或者根本不抛出任何异常)。特别需要说明的是,如果超类方法没有抛出任何受查异常,子类也不能抛出任何受查异常。例如,如果覆盖JComponent.paintComponent方法,由于超类中这个方法没有抛出任何异常,所以,自定义的paintComponent也不能抛出任何受查异常。
如果类中的一个方法声明将会抛出一个异常,而这个异常是某个特定类的实例时,则这个方法就有可能抛出-一个这个类的异常,或者这个类的任意一个子类的异常。例如,Flhpustremn构造器声明将有可能抛出-↑IExcetion异常,然而并不知道具体是哪种IOExcepion异常。它既可能是IExcpionn异常,也可能是其子类的异常,例如,FileNotFoundExceptiono