Java 异常机制入门:try-catch-finally、throw、throws 运行时异常完整解析 在 Java 程序运行过程中经常会遇到各种错误情况例如除数为 0、数组下标越界、空指针访问、文件找不到等。如果程序没有处理这些错误就会异常终止。Java 提供了异常处理机制可以把程序运行中的错误封装成异常对象让程序在出现问题时不至于直接崩溃同时也能把正常业务逻辑和错误处理逻辑分开提高代码的可读性和可维护性。本文围绕实验六中的异常机制重点讲解以下内容异常的基本概念try-catch-finally的使用throw手动抛出异常throws声明异常编译时异常与运行时异常的区别。一、什么是异常异常是程序运行过程中出现的非正常情况。Java 中所有异常类都继承自Throwable它下面主要有两个分支Error严重错误一般与虚拟机、系统资源有关程序通常无法处理Exception异常情况可以通过代码捕获或处理。我们平时所说的 “异常处理”主要针对Exception及其子类。例如这段代码运行时会抛出ArithmeticException这是典型的运行时异常。System.out.println(9 / 0);二、异常产生的两种方式1. JVM 自动抛出异常当程序运行出现错误时Java 虚拟机会自动创建异常对象并抛出。例如public class TestException { public static void main(String[] args) { System.out.println(main start); int a 10 / 0; System.out.println(main end); } }运行结果中会出现Exception in thread main java.lang.ArithmeticException: / by zero因为除数为 0JVM 自动抛出了算术异常。注意异常一旦发生异常点后面的代码不会继续执行。2. 使用throw手动抛出异常除了 JVM 自动抛出开发者也可以使用throw关键字主动抛出一个异常对象。格式如下throw new 异常类名(异常信息);例如public class TestThrow { public static void main(String[] args) { int age -3; if (age 0) { throw new RuntimeException(年龄不能为负数); } System.out.println(年龄 age); } }运行结果Exception in thread main java.lang.RuntimeException: 年龄不能为负数throw常用于业务规则判断当数据不符合要求时主动终止当前逻辑并给出错误提示。三、异常处理的两种方式Java 异常处理主要有两种方式积极处理使用try-catch-finally捕获异常消极处理使用throws声明异常交给上层调用者处理。四、try-catch-finally 的使用try-catch-finally是 Java 中最常用的异常处理结构。格式try { // 可能出现异常的代码 } catch (异常类型 e) { // 捕获异常后的处理代码 } finally { // 无论是否发生异常都会执行的代码 }示例public class TestTryCatch { public static void main(String[] args) { try { int a 10 / 0; System.out.println(结果 a); } catch (ArithmeticException e) { System.out.println(捕获到异常 e.getMessage()); } finally { System.out.println(finally块执行); } System.out.println(程序继续运行); } }运行结果捕获到异常/ by zero finally块执行 程序继续运行说明try中放可能出错的代码catch捕获异常并处理finally无论是否发生异常都会执行异常被捕获后程序可以继续运行。五、finally 的重要特性finally有一个非常重要的特点无论是否发生异常它都会执行。因此finally通常用于释放资源、关闭文件、关闭数据库连接等操作。例如public class TestFinally { public static void main(String[] args) { try { System.out.println(try块); int a 10 / 0; } catch (Exception e) { System.out.println(catch块); } finally { System.out.println(finally块始终执行); } } }运行结果try块 catch块 finally块始终执行六、finally 中 return 的问题实验六中曾经提到一个关键点如果finally中包含return语句会覆盖try或catch中的返回值。示例public class TestFinallyReturn { public static int test() { try { return 1; } catch (Exception e) { return 2; } finally { return 3; } } public static void main(String[] args) { System.out.println(test()); } }最终输出3原因是finally在方法返回前执行如果finally中有return会直接改变方法最终返回的值。七、throws 声明异常如果一个方法内部可能发生异常但当前方法不想处理可以使用throws把异常交给上层调用者处理。格式访问修饰符 返回类型 方法名(参数列表) throws 异常类型 { // 方法体 }示例public class TestThrows { public static void main(String[] args) throws Exception { ma(); } public static void ma() throws Exception { mb(); } public static void mb() throws Exception { throw new Exception(异常从mb方法抛出); } }运行结果Exception in thread main java.lang.Exception: 异常从mb方法抛出异常传递过程是mb 抛出异常 → ma 没有捕获继续向上抛出 → main 也没有捕获交给JVM处理八、throw 和 throws 的区别表格关键字作用使用位置throw手动抛出一个异常对象方法内部throws声明方法可能抛出某种异常方法参数列表后面简单记忆throw是 “抛出异常”throws是 “声明异常”。九、编译时异常和运行时异常Java 异常可以分为两大类1. 编译时异常Checked Exception编译时异常在编译阶段就会被检查编译器要求必须处理要么try-catch要么throws。例如ExceptionIOExceptionFileNotFoundExceptionClassNotFoundException这类异常通常表示外部环境问题比如文件不存在、网络异常等。2. 运行时异常Runtime Exception运行时异常在编译阶段不强制要求处理程序运行出错时才会触发。例如NullPointerExceptionArithmeticExceptionArrayIndexOutOfBoundsExceptionClassCastException这类异常通常与程序逻辑有关比如空指针访问、除数为 0、数组下标越界等。十、异常处理的意义合理使用异常处理可以让程序更加健壮避免程序因小错误直接崩溃把业务代码和错误处理代码分开给用户更友好的错误提示方便定位问题和调试程序。但也要注意异常处理不能滥用不要为了 “不出错” 就把所有异常都吃掉否则会掩盖真实问题。总结异常是程序运行中的非正常情况Java 通过异常机制处理错误try-catch-finally用于捕获和处理异常throw用于手动抛出异常对象throws用于声明方法可能抛出异常finally始终执行若其中有return会覆盖方法返回值异常分为编译时异常和运行时异常前者编译器强制处理后者一般通过逻辑判断避免。