一、引言
在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); } }
七、结语
异常处理是Java编程中必不可少的一部分,它不仅能够帮助我们排查和修复程序中的错误,还能提升程序的可读性和可维护性。在实际的项目开发中,我们应该养成良好的异常处理习惯,及时捕获和处理异常,避免程序因为异常而崩溃或产生意外结果。同时,我们也要注意异常处理的粒度,避免过度捕获异常,影响程序性能。