异常
1. 异常概述
(1)异常是什么
异常是代码在编译或者执行的过程中可能出现的错误。
(2)异常分为几类
编译时异常、运行时异常。
编译时异常:没有继承RuntimeExcpetion的异常,编译阶段就会出错。
运行时异常:继承自RuntimeException的异常或其子类,编译阶段不报错,运行可能报错。
(3)学习异常的目的
避免异常的出现,同时处理可能出现的异常,让代码更稳健。
2.常见运行时异常
(1)运行时异常
直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。
(2)示例
数组索引越界异常: ArrayIndexOutOfBoundsException
空指针异常 : NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
数学操作异常:ArithmeticException
类型转换异常:ClassCastException
数字转换异常: NumberFormatException
运行时异常:一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误, 自己的水平有问题!
3.常见编译时异常
(1)编译时异常
不是RuntimeException或者其子类的异常,编译阶就报错,必须处理,否则代码不通过。
(2)作用
是担心程序员的技术不行,在编译阶段就爆出一个错误, 目的在于提醒不要出错!
编译时异常是可遇不可求。遇到了就遇到了呗。
4.异常默认处理流程
默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
直接从当前执行的异常点干掉当前程序。
后续代码没有机会执行了,因为程序已经死亡。
5.编译时异常的处理机制
(1)三种
出现异常直接抛出去给调用者,调用者也继续抛出去。
出现异常自己捕获处理,不麻烦别人。
前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
(2)throws
throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
(3)try...catch...
可以把多个异常放在一个try...catch...中。
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
格式:
建议格式:
(4)前两者相结合
方法直接将异常通过throws抛出去给调用者。
调用者收到异常后直接捕获处理。
(5)总结
在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理。
实际应用中,只要代码能够编译通过,并且功能能完成,那么每一种异常处理方式似乎也都是可以的。
6.运行时异常的处理机制
(1)运行时异常的处理形式
运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。
按照规范建议还是处理:建议在最外层调用处集中捕获处理即可。
7.异常处理使代码更稳健的案例
1 import java.util.Scanner; 2 3 /** 4 * 键盘录入一个合理的价格为止(必须是数值)。 >0 5 * 定义一个死循环,让用户不断的输入价格。 6 */ 7 public class demo1 { 8 public static void main(String[] args) { 9 10 Scanner sc = new Scanner(System.in); 11 12 while (true) { 13 try { 14 System.out.println("请输入合法的价格:"); 15 16 String priceStr = sc.nextLine(); 17 18 // 转换成double类型的价格 19 double price = Double.valueOf(priceStr); 20 21 // 判断价格是否大于0 22 if (price > 0) { 23 System.out.println("定价:" + price); 24 break; 25 }else { 26 System.out.println("出错了! 出错了!"); 27 } 28 } catch (Exception e) { 29 System.out.println("别乱输TMD!"); 30 } 31 } 32 } 33 }
8.自定义异常
Java无法为这个世界上全部的问题提供异常类。
如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了。
好处:
可以使用异常的机制管理业务问题,如提醒程序员注意。
同时一旦出现bug,可以用异常的形式清晰的指出出错的地方。