很多人可能要问,java这是怎么了,他没事找事声明异常干嘛呀?接下来给大家浅显的讲一下java为什么要声明异常。
首先我们都知道只要在一个方法体中抛出了异常,java就希望调用者能够去捕获异常。
于是我们通过throws便可以声明某个方法可能抛出的异常
下面我们看一个程序稍微加深一下了解
1 class Son1Exception extends Exception{
2
3 }4 class Son2Exception extends Exception{
5
6 }
7 public class A{8 void test1() throws Son1Exception{
9 throw new Son1Exception();
10 }
11 public static void main(String[] args){
12 A a=new A();
13 try{
14 a.test1();
15 }
16 catch(Son1Exception()){
17 System.out.print("异常1");
18 }
19 }
20 }
这个程序没有错误
但是如果我们把第8行去掉声明改成"void test1(){",那么显然系统报错
接下来聊到重点了,有一个有趣的现象,如果该程序其他地方不变,我们单单把test1()函数的函数体去掉
即void test1(){
}
结果会怎样呢?
大家可能会想:这还不简单,test()这东西连函数体没了,他也就不抛出任何异常,如果这函数连异常都抛不出了,那他还有什么用啊?catch岂不是不能捕获到Son1Exception了,那么16行是不是将会出现:“执行不到的 Son2Exception 的 catch 块。从未从 try 语句主体抛出此异常。”呢?
如果你这么想,那就大错特错了,不信你试试,改了以后虽然运行后什么都没发生,但程序仍然编译成功。
看到这里,大家可能就明白了,调用一个函数无论这个函数你抛不抛出异常,只要你声明了异常,程序就会准备好接收这个异常。
这么说更贴切点:声明就像是身份证,只要你有身份证,不管你有没有这个人存在,大家都认为有可能有这个人存在,反过来说,你没有身份证,即使你存在,也没有人会知道有这么一个人。
所以说java他处理异常的第一步是先核对声明,再根据声明做好准备再判断是不是有这么一个异常的。
当然了,RuntimeException类异常就另当别论了,这是后话