一、要点
下面对异常的捕获及处理做一总结:
1、异常是导致程序中断运行的一种指令流,当异常发生时,如果没有进行良好的处理,则程序将会中断执行。
2、异常可以使用try•••catch进行处理,也可以使用try•••catch•••finally进行处理,在try语句中捕捉异常,然后在catch中处理异常,finally作为异常的统一出口,不管是否发生异常都要执行此段代码。
3、异常的最大父类是Throwable,其分为两个子类,分别为Exception、Erroro。Exception 表示程序处理的异常,而Error表示JVM错误,一般不由程序开发人员处理。
4、发生异常后,JVM会自动产生一个异常类的实例化对象,并匹配相应的catch语句中的异常类型,也可以利用对象的向上转型关系直接捕获Exception。
5、throws用在方法声明处,表示本方法不处理异常。
6、throw表示在方法中手工抛出一个异常。
7、自定义异常类时,只需要继承Exception类即可。
8、断言是JDK 1.4后提供的新功能,可以用来检测程序的执行结果,但开发中并不提倡使用断言进行检测。
9、最后
(1)通过继承java.lang.Exception类声明自己的异常类。
(2)在方法适当的位置生成自定义异常的实例,并用throw语句抛出。
(3)在方法的声明部分用throws语句声明该方法可能抛出的异常。
二、习题
题目:编写应用程序,从命令行输入两个小数参数,求它们的商。要求程序中捕获 NumberFormatException异常和ArithmeticException异常。
分析:ArithmeticException 算数异常:判断除数是否为0; NumberFormatException 数字格式异常:判读输入的数字是否是数字
代码如下:
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner s = new Scanner(System.in); while(true){ try{ System.out.println("输入除数"); float f1 = Float.parseFloat(s.nextLine()); System.out.println("输入被除数"); float f2 = Float.parseFloat(s.nextLine()); if(f2==0){ throw new ArithmeticException("捕获到除0异常~~!!");//手动抛出除零异常 } float result = f1/ f2; System.out.println("计算结果:" + f1 + "/" + f2 + "=" + result); break;//如果能正常运行到这里,说明前面的输入都是正确的,所以可以跳出循环了 }catch(NumberFormatException e1){//捕获数字格式异常 System.out.println("捕获到数字格式异常"); }catch (ArithmeticException e2) {//捕获到除零异常 System.out.println(e2.getMessage()); } } } }
运行结果:
输入除数 4 输入被除数 0 捕获到除0异常~~!! 输入除数 2 输入被除数 a 捕获到数字格式异常 输入除数 6 输入被除数 9 计算结果:6.0/9.0=0.6666667