一、异常的基本概念
在java语言种,异常就是程序执行过程不希望出现的问题,如果执行过程中出现了异常,jvm就会终止,应用程序随之终止,开发过程种的语法错误和逻辑错误不是异常
二、java中异常的结构Throwable类是Java语言中所有错误和异常的超类,它有两个子类:
- Error:表示执行中的错误,Error是java程序中无法解决的严重问题,比如StackOverflowError表示栈溢出,Error是严重错误,程序会奔溃。
- Exception:表示程序执行中可以被捕获并处理的异常,可以使用针对性代码进行处理,例如空指针异常,Exception可以分为两大类:运行时异常和编译时异常
三、异常体系图
常见的运行时异常包括:
- NullPointerException 空指针异常
- ArithmeticException 数学运算异常
- ArrayIndexOutOfBoundsException 数组下标越界异常
- ClassCastException 类型转换异常
- NumberFormatException 数字格式不正确异常
常见的运行异常:
- FileNotFoundException:文件找不到的异常
- ClassNotFoundException:类找不到的异常
- DataFormatException:数据格式化异常
- NoSuchFieldException:没有匹配的属性异常
- NoSuchMethodException:没有匹配的方法异常
- SQLException:数据库操作异常
- TimeoutException:执行超时异常
四、异常的处理
- try - catch - finally:程序员在代码块中捕获发生的异常自行处理
- throws:将发生的异常抛出,交 A给调用者处理,最顶级的就是JVM
try - catch -finally 方式处理异常注意事项:
- 如果异常发生了,则异常后面的代码不会执行,直接进入到catch块。
- 如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
- 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码 - finally{ }
- 如果 try 代码块有可能有多个异常 ,可以使用多个 catch 分别捕获不同的异常,相应处理 要求子类异常写在前面,父类异常写在后面
- 可以进行 try-finally 配合使用, 这种用法相当于没有捕获异常, 因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常, 都必须执行某个业务逻辑
try - catch -finally 执行顺序:
- 如果没有出现异常,则执行try块中所有语句,不执行catch中的语句,如果又finally,最后还需要执行finally里面的语句
- 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行,将执行catch块中语句,如果有finally,最后还需要执行finally里面的语句!
package ExceptionEx01.Homework; import java.util.Scanner; public class Homework01 { public static void main(String[] args) { try { if (args.length < 2){ //判断args长度 throw new ArrayIndexOutOfBoundsException("参数有误!!"); //抛出异常 } int n1 = Integer.parseInt(args[0]); //转化为int类型 int n2 = Integer.parseInt(args[1]); System.out.println(new Homework01().cal(n1,n2)); }catch (NumberFormatException n){ //获取类型异常 System.out.println("输入的类型有误!"+" "+n); }catch (ArithmeticException a){ //获取输入异常数字 System.out.println("除数不能为0!!"+" "+a); }catch (ArrayIndexOutOfBoundsException a){ System.out.println(a.getMessage()); //获取输出数组越界异常 }finally { System.out.println("必须执行~"); } } public int cal(int n1,int n2){ return n1 / n2; } }
throws 异常处理:
基本介绍:当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象,可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理–>中断处理
注意事项和使用细节:
- 对于编译异常,程序中必须处理,比如 try-catch 或者 throws
- 对于运行时异常,程序中如果没有处理,默认就是 throws 的方式处理
- 子类重写父类的方法时,对抛出异常的规定:子类重写的方法, 所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型
- 在 throws 过程中,如果有方法 try-catch , 就相当于处理异常,就可以不必 throws
五、自定义异常
基本介绍:在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类来描述这些问题,给出清楚的提示。
定义步骤:
继承 Exception 或 RuntimeException
使用Exception属于编译异常
使用RuntimeException属于运行异常
自定义异常实例:
package ExceptionEx01.Homework; public class Exceptiontext { public static void main(String[] args) /*throws AgeException*/ { int age = 180; //要求范围在 18 – 120 之间,否则抛出一个自定义异常 if(!(age >= 18 && age <= 120)) { //这里我们可以通过构造器,设置信息 throw new AgeException("年龄需要在 18~120 之间"); } System.out.println("你的年龄范围正确."); } } //自定义一个异常 //老韩解读 //1. 一般情况下,我们自定义异常是继承 RuntimeException //2. 即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制 //3. 即比较方便 class AgeException extends RuntimeException { public AgeException(String message) {//构造器 super(message); } }