在java中,有很多时候会因为自己的不小心,写的程序会有一些异常出现,但是,我们自己可能难以发现其中的问题。于是就出现了异常处理。平常我们会用try catch finally来处理异常,但是,有时候,我们可能想把这个异常交给调用它的程序处理,那么,在这个时候,我们就会用到throws把异常情况抛给调用它的程序去处理这个程序出现的异常情况。
throws_throws -throws简介
throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为这在程序的 正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。
throws_throws -与throw对比
关键字:throwthrow是一种控制程序流程的特殊方法而已。没有相应的catch的话,可以中止当前的方法继续执行。
关键字:throws声明方法时候,如果不声明throws的话,那么一般的Exception都要在这个方法中终结,也就是说一定要有相应的catch处理,否则编译时会产生错误。如果方法声明了throws的话,可以交给上一级方法去处理。以此类推。但是有些Exception可以不加捕捉,编译也会通过。继承Exception类,可以自己定义Exception,对于特定的状态,用throw抛出专用的例外。这对于特定的middleware开发,有一定帮助。
throws用于声明,它并不是一个可以执行的语句。throws放在方法声明的后面部分,用来说明这个方法可能会抛出什么异常,
staticvoidthrowOne()throwsIllegalAccessException
这个声明告诉调用者,方法throwOne可能会抛出IllegalAccessException异常。
格式是:方法声明throws异常类1,异常类2,...
而throw则是一个动作,执行throw语句的时候会抛出一个异常。
关键字:try、catch用个形象的比喻,如果说throws相当于职业介绍中介的话,那try和catch就是一对倒霉的打工仔。很有意思,throws只是告诉编译器--方法可能产生的异常问题,然后把问题处理抛给try和catch。他们一个负责发现异常关系,一个负责异常捕获。很辛苦的一对难兄难弟哦,:)
throws_throws -程序实例
classThrowsDemo{
staticvoidthrowOne(){
System.out.println("InsidethrowOne.");
thrownewIllegalAccessException("demo");
}
publicstaticvoidmain(Stringargs[]){
throwOne();
}
}
为编译该程序,需要改变两个地方。第一,需要声明throwOne()引发IllegalAccessException异常。第二,main()必须定义一个try/catch语句来捕获该异常。
正确的例子如下:
classThrowsDemo{
staticvoidthrowOne()throwsIllegalAccessException{
System.out.println("InsidethrowOne.");
thrownewIllegalAccessException("demo");
}
publicstaticvoidmain(Stringargs[]){
try{
throwOne();
}catch(IllegalAccessExceptione){
System.out.println("Caught"+e);
}
}
}
下面是例题的输出结果:
insidethrowOne
caughtjava.lang.IllegalAccessException:demo