标签:异常处理
1. 背景
很多时候,我们的方法都会产生一些错误,例如在写除法计算器时,如果除数为0,则系统会返回除0的异常错误,因此为了让方法的调用者知悉异常情况,让其自行处理异常,因此JAVA引入异常(Exception)这一对象。
2. 分类
java中异常老祖宗为Object类,然后接下来是Throwable,如下图所示:
比较常见的运行时错误为代数错误、空指针异常、数组越界、参数非法;
而IO异常指的是读写文件时的一些错误;ClassNotFoundException指未找到类异常;
而至于最后的Error一般是操作系统的问题,一般不会出现。
【注意】如上图,RuntimeException和Error分类下的异常免检,因为比较常见,因此java规定不用强制声明、抛出和处理异常,其他异常必须检查,表现在编译器就是会报错,因此此时我们只需要在被调用方法头加上throws Exception或者在调用方法内加上try-catch块进行处理。
3. 格式
那么异常应该怎么声明、创建和处理呢?
首先声明异常:正常的方法写完后(返回值类型、方法签名),大括号前声明异常,表明该方法可能会返回某种异常,格式为:
throws ArithmeticException(异常类型)
然后就是方法内部创建/抛出异常,这里当除数为0,抛出一个代数异常,本质上是通过new新建了一个代数异常类的对象,括号内为提示信息,即:
throw new ArithmeticException("除数非法,不能是整数0")
最后是处理异常,main方法中将方法返回值给outCome变量,如果出错让catch捕获异常,然后处理,即:
通过try-catch语句块执行,正常情况是执行try语句,然后结束try-catch语句块,一旦出现异常则跳转到catch语句,然后跳出try-catch语句块。
【总结】由此可见,称之为抛出是很形象的,相当于从throw的地方将异常传递给了try-catch方法块中的catch,然后结束。
【总结2】catch块异常类型必须从小到大(不然永远都是执行第一句,与逻辑相反!)
4. 异常继承
值得注意的是,如果父类中方法没有显示声明异常,则子类不可继承其异常类型。
5. 异常使用时机
由于new一个异常对象、异常处理追溯需要资源,故当且仅当在应对不可预料的逻辑错误时需要加入try-catch语句,否则采用正常的逻辑即可。