本文详细讲解Java异常机制核心知识点,涵盖异常体系结构、处理方式(try-catch-finally、throws)、自定义异常、throw与throws区别、常见运行时异常。
一、异常概述
异常是程序在运行过程中出现的错误或不正常情况,会中断程序的正常执行流程。
Java采用异常处理机制,让程序出现问题时可以优雅处理,而不是直接崩溃。
二、异常体系结构
所有异常的根类:java.lang.Throwable
两大子类:
Error(错误)
- 系统级别、JVM级别的严重问题
- 程序无法处理,如:StackOverflowError、OutOfMemoryError
- 无需捕获处理
Exception(异常)
- 程序可以捕获和处理的问题
- 分为编译时异常、运行时异常
1. 编译时异常(受检异常)
- 必须在编译阶段处理,否则代码无法运行
- 如:IOException、SQLException、ClassNotFoundException
2. 运行时异常(非受检异常)
- 运行阶段才会抛出,编译不强制检查
- 如:NullPointerException、IndexOutOfBoundsException、ArithmeticException
- 一般由代码逻辑错误导致
三、异常处理方式一:try-catch-finally
1. 标准格式
try{// 可能出现异常的代码}catch(异常类型 变量名){// 捕获到异常后执行的处理逻辑}finally{// 无论是否异常,最终都会执行(释放资源常用)}2. 代码演示
publicclassTryCatchDemo{publicstaticvoidmain(String[]args){try{// 可能出现异常的代码inta=10;intb=0;System.out.println(a/b);// 算术异常}catch(ArithmeticExceptione){// 捕获异常并处理System.out.println("捕获到算术异常:除数不能为0");e.printStackTrace();// 打印异常堆栈信息}finally{System.out.println("finally代码块最终一定会执行");}System.out.println("程序继续向下执行");}}3. 多catch捕获
try{// 代码}catch(NullPointerExceptione){// 空指针处理}catch(IndexOutOfBoundsExceptione){// 越界处理}catch(Exceptione){// 其他异常}四、异常处理方式二:throws 声明抛出
将异常抛给上层调用者处理,自己不处理。
publicclassThrowsDemo{// 抛出异常,交给调用者处理publicstaticvoidtest()throwsException{inta=10;intb=0;System.out.println(a/b);}publicstaticvoidmain(String[]args){try{test();}catch(Exceptione){e.printStackTrace();}}}五、throw 手动抛出异常
在程序中主动抛出一个异常。
publicclassThrowDemo{publicstaticvoidcheckAge(intage){if(age<0||age>150){// 手动抛出异常thrownewIllegalArgumentException("年龄不合法:"+age);}}}六、throw 和 throws 区别
throw
- 方法内部使用
- 手动抛出一个异常对象
- 抛出一个具体异常
throws
- 方法声明上使用
- 将异常交给调用者处理
- 可以声明多个异常
七、自定义异常
- 继承
Exception(编译时异常) - 继承
RuntimeException(运行时异常)
// 自定义年龄非法异常publicclassAgeIllegalExceptionextendsRuntimeException{publicAgeIllegalException(){}publicAgeIllegalException(Stringmessage){super(message);}}使用自定义异常
publicstaticvoidcheck(intage){if(age<0){thrownewAgeIllegalException("年龄不能为负数");}}八、常见运行时异常
- NullPointerException空指针异常
- IndexOutOfBoundsException索引越界异常
- ArithmeticException算术异常
- IllegalArgumentException参数非法异常
- ClassCastException类型转换异常
- NumberFormatException数字格式转换异常
九、finally 关键字特点
- 无论是否发生异常,finally一定执行
- 唯一不执行情况:JVM退出(System.exit(0))
- 常用于:IO流关闭、数据库连接释放、资源回收