Java -> 异常知识体系总结

 

 

  • 运行时异常【RuntimeException】
  • 1、数组索引越界异常【ArrayIndexOutOfBoundsException】

 

  •  2、空指针异常【NullPointerException】

 

 

 从源码中也可以看到,运行时的异常继承自RuntimeExcetion

 

  •  3、类型转换异常【ClassCastFormatException】

 

 

  •  4、数字操作异常【ArithmeticException】

 

 

  •  数字格式化异常【NumberFormatException】

  • 编译时异常【不是RuntimeException或者其子类的异常,编译阶段就报错,必须处理,否则代码不通过】

示例代码:将字符串类型的日期转换成日期格式化对象,虽然代码写的没有问题,但程序显示有编译时异常而不通过:

 

 

  •  异常的默认处理流程:

 

 

 从异常的默认处理流程可以看出:

异常的默认处理机制并不好,因为程序一旦出现异常,出现异常的地方便会被虚拟机干掉,从而导致后边的程序无法执行,因此,我们需要对异常的处理进行相应的干预措施。

  • 1、异常的处理方式1--throws

throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用这处理。

这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序的死亡

 

 

 

 

 

 因为编译时异常直接或间接继承自Exception类,所以可以直接写为:throws Exception

 

 

  •  2、异常的处理方式2--try..catch..
  • 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理;
  • 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。

 

 

 示例程序运行结果:

 

 

 不过,由于在实际的开发中,可能会遇到上一步的逻辑业务逻辑处理结果要为下一步的数据服务的情况,也就是说:一个可能会发生异常的程序如果发生了异常,那么后边可能发生异常的程序也没有执行的必要了,所以,我们建议采用整体try--catch的处理方法。即:

 

 

  •  异常的处理方式3 -- 前两着结合
  • 底层异常抛出去给最外层,最外层集中捕获处理

 

运行时异常:

 

 

 

 

 

 

 

  •  案例:异常处理使代码更稳健的案例
  • 需求:键盘录入一个合理的价格为止(必须是数值,值必须大于0)。
  • 分析:定义一个死循环,让用户不断地输入价格。

对于这个需求,我们几乎可以手到擒来整上这么几段代码:

 1 public static void main(String[] args) {
 2         Scanner sc = new Scanner(System.in);
 3         while (true){
 4             System.out.println("请输入价格:");
 5             String str = sc.nextLine();
 6             double price = Double.valueOf(str);
 7             if (price > 0){
 8                 System.out.println("价格为:" + price);
 9                 break;
10             }else {
11                 System.out.println("价格必须大于0");
12             }
13         }
14     }

代码运行示例:

 

 

 乍一看貌似也没什么毛病,也可以实现功能,可是,当我们输入一些乱七八糟地数据时,便会造成程序异常:

 

 

 解决方法:

<方法1>,我们可以使用之前所学过地正则表达式进行校验机制:

 

 

 示例代码运行结果:

 

 

 <方法2>使用异常机制

 

 

 

 

 

  •  自定义编译时异常:实现年龄小于0岁和大于200岁时抛出异常;

自定义异常类 AgeIlleagalException

 

 

测试类:

 

 如此我们便实现了自定义异常,这样做的话就会对后续调用这个方法的人做出一个善意的提醒,如果其他调用者对自己所写的代码很自信的话则可以使用try--catch或则选择继续往上抛的方式处理这个自定义编译时异常。

 

  •  自定义运行时异常(创建过程与自定义编译时异常类似,只不过把之前的Exception更改为RuntimeException)

 

 

 

 

 

posted @ 2022-06-23 19:14  羽梦齐飞  阅读(29)  评论(0编辑  收藏  举报