(注:本篇文章全面的介绍了Java中的异常问题;欢迎大家学习讨论和批评指正)
概念
程序执行过程中不正常的情况
分类
- Throwable: 总父类,表示不正常的情况
- Error: 错误
- 无法解决也无法提前避免的问题
- 通常由硬件设备或内存等问题导致
- Exception:异常
- 可以解决或提前避免的问题
- 通常由代码导致
- 分类:
- RuntimeException:运行时异常,也称为未检查异常、未检异常等
- 编译不报错,运行报错
- 可以处理也可以不处理
- java.lang.ArrayIndexOutOfBoundsException:数组下标越界
- java.lang.StringIndexOutOfBoundsException:字符串下标越界异常
- java.lang.IndexOutOfBoundsException:下标越界异常
- java.lang.NullPointerException:空指针异常
- java.lang.ClassCastException:类型转换异常
- java.lang.NumberFormatException:数据类型转换异常
- java.lang.Arithm eticException:数学运算异常
- …
- 都来自于java.lang包
- 非RuntimeException: 非运行时异常,也称为已检查异常、已检异常等
- 编译就会报错
- 必须处理
- 只要不是运行时异常,就一定是非运行时异常
- RuntimeException:运行时异常,也称为未检查异常、未检异常等
异常的产生
-
自动产生: 当运行到有问题的代码时会自动产生异常,程序终止
-
手动产生:
throw 异常对象;
- 位置:方法内部
- 作用:当程序执行到该语句,则会抛出一个异常对象,使程序强制终止
- 使用: 同一直属范围内,下方不可存在其他有效语句
- 无法执行
程序终止执行:
- 代码正常运行结束
- 执行到异常
- 执行到return;
异常的处理
-
上抛异常: 消极处理
访问修饰符 返回值类型 方法名(形参列表)throws 异常类名1,异常类型2,..{ }
- 作用: 将当前方法的内部异常向上抛至调用者,当前方法无法处理该异常. 此时异常并不会被根治,如果异常最终上抛至虚拟机,则仍然会导致程序终止
- 使用:
- 上抛父类异常也可以处理内部的子类异常
- 调用者需要处理解决的异常类型由throws上抛的类型决定
throw和throws的区别:
- 位置:throw写在方法内部,throws写在方法声明处
- 作用:throw是抛出制造异常,throws是上抛解决异常
-
捕捉并解决异常:积极处理
try{ //有可能出现异常的代码 }catch(有可能匹配的异常类名 引用名){ // 对应的处理方案 }
- 特点:可以根治异常问题,如果异常正常匹配成功,则程序会继续向下执行
- 使用:
- 当try中内容出现异常时,会立即开始匹配catch块,如果catch块匹配成功则程序继续执行,如果失败,则异常仍会出发程序仍然终止
- 可以存在多个catch块,自上而下的进行匹配
- 一个try-catch结构至多执行一个catch块
- 父类异常类型可以兼容匹配子类异常
- 父类异常需要写在子类异常之下
- 为了保证匹配一定成功,通常会在catch最下方匹配一个Exception
- 如果发生的是非运行时异常,则catch块无法捕捉与其无关的非运行时异常,编译报错
- 异常信息处理:
- String getMessage():获取异常的详细信息
- void printStackTrace():打印输出异常的追栈(追踪)信息(异常类型+异常的详细信息+异常的触发位置)
-
finally块
-
特点:无论如何都会执行,通常用来关闭资源
-
语法:
try{ }catch(){ }finally{ }
-
使用;
- 必须与try结合使用,无法与catch单独结合
- 当try-catch-finally中出现return语句冲突时,优先执行finally
-
自定义异常
-
运行时异常:继承RuntimeException
- 需要提供有参构造给最大父类Throwable中的详细信息属性赋值
package com.by.exception; /** * 自定义运行时异常类 */ public class MyRuntimeException extends RuntimeException{ public MyRuntimeException(){ } public MyRuntimeException(String message) { super(message); } }
-
非运行时异常:继承Exception
- 构造要求与运行时异常一致
package com.by.exception; /** * 自定义非运行时异常 */ public class MyException extends Exception{ public MyException(){} public MyException(String message) { super(message); } }
今日掌握
- 异常的完整分类
- throw和throws的区别
- try-catch-finally的使用
- 自定义异常的写法