[]你必须要知道的Java 异常的捕获与处理(详解附源码)( 二 )


但是 , 对于之前的程序又有了问题:现在执行数学计算的两个参数 , 都是由程序默认提供 , 那么如果说现在两个计算的参数通过初始化参数传递呢?public class Test {public static void main(String args[]) {System.out.println("1、除法计算开始 。");try {int x = Integer.parseInt(args[0]); // 接收参数int y = Integer.parseInt(args[1]); // 接收参数int result = x / y;System.out.println("2、除法计算结果:" + result);} catch (ArithmeticException e) {e.printStackTrace();} finally {System.out.println("不管是否出现异常都执行");}System.out.println("3、除法计算结束 。");}}
这个时候 , 数据由外部传送 , 那么就有可能出现以下几类问题:
(1)执行时不输入参数(java TestDemo) , ArrayIndexOutOfBoundsException , 未处理;
(2)输入的参数不是数字(java TestDemo a b) , NumberFormatException , 未处理;
(3)被除数为0(java TestDemo 10 0) , ArithmeticException , 已处理 。
可以发现 , 以上的程序实际上是存在三种异常 , 而程序之中只能够处理一种 , 而对于不能处理的异常 , 发现程序依然会直接中断执行 。
加入多个catch:public class Test {public static void main(String args[]) {System.out.println("1、除法计算开始 。");try {int x = Integer.parseInt(args[0]);int y = Integer.parseInt(args[1]);int result = x / y;System.out.println("2、除法计算结果:" + result);} catch (ArithmeticException e) {e.printStackTrace();} catch (ArrayIndexOutOfBoundsException e) {e.printStackTrace();} catch (NumberFormatException e) {e.printStackTrace();} finally {System.out.println("不管是否出现异常都执行");}System.out.println("3、除法计算结束 。");}}
现在 , 程序比之前更健壮了 。
【[]你必须要知道的Java 异常的捕获与处理(详解附源码)】三、异常的处理流程
以上已经完成了异常的基本处理 , 但是所有的异常都像之前那样一条条的判断似乎是一件不可能完成的任务 , 因为日后肯定会接触到一些不常见的异常信息 , 那么下面就必须首先研究异常的流程和结构 。
先查看两个异常类的继承结构:
(1)ArithmeticException:java.lang.Object|- java.lang.Throwable|- java.lang.Exception|- java.lang.RuntimeException|- java.lang.ArithmeticException
(2)ArrayIndexOutOfBoundsException:java.lang.Object|- java.lang.Throwable|- java.lang.Exception|- java.lang.RuntimeException|- java.lang.IndexOutOfBoundsException|-java.lang.ArrayIndexOutOfBoundsException
可以发现 , 所有的异常类型最高的继承类是Throwable , Throwable下有两个子类:
(1)Error:指的是JVM错误 , 这个时候的程序并没有执行 , 无法处理;
(2)Exception:指的是程序之中出现的错误信息 , 可以进行异常处理 。
通过继承关系可以发现 , 在进行日后异常处理的时候是以Exception为主 , 并且可以形成以下的异常处理流程:
[]你必须要知道的Java 异常的捕获与处理(详解附源码)
文章图片

文章图片

image
(1)如果程序中产生了异常 , 那么JVM根据异常的类型 , 实例化一个指定异常类的对象;
(2)如果这时程序中没有任何的异常处理操作 , 则这个异常类的实例化对象将交给JVM进行处理 , 而JVM的默认处理方式就是进行异常信息的输出 , 而后中断程序执行;
(3)如果程序中存在了异常处理 , 则会由try语句捕获产生的异常类对象;


推荐阅读