【Java基础(九)】异常

张开发
2026/4/10 9:08:14 15 分钟阅读

分享文章

【Java基础(九)】异常
定义异常Exception指在程序的运行过程中发生了不正常的现象阻止了程序的运行称之为发生异常。语法try{// 这里放入可能出现异常的代码}catch(Exceptionex){// 1. 这里放入处理异常的代码如果try代码出现异常则会执行此处代码// 2. 若try中没有异常则不会执行此处代码|------------------------||// 可以有多重catch ||// 会从上往下判断 ||// 只会执行其中一个 ||}catch(Exceptionex){||------------------------|}finally{// 此处放入使用要执行的代码无论是否发生异常// 唯一的例外遇到System.exit()时不会执行此处代码}异常分类对比维度Error (错误)Exception (异常)本质不可恢复的严重系统级问题。可恢复的程序运行时问题。产生原因JVM层面的资源耗尽或系统崩溃如内存溢出、栈溢出。程序逻辑错误或外部环境因素如文件不存在、空指针。处理方式不应被捕获。程序通常只能终止。应该被捕获和处理使程序能优雅地继续或退出。常见示例OutOfMemoryError(内存溢出)StackOverflowError(栈溢出)NullPointerException(空指针)IOException(IO异常)throw 和 throws的区别位置内容作用throw方法内部throw 异常对象制造异常抛出异常throws方法的签名处、声明处throws 异常类型告诉方法的调用者这个方法可能出现的异常异常分类检查型异常 vs 非检查型异常对比维度检查型异常 (Checked Exception)非检查型异常 (Unchecked Exception / RuntimeException)继承关系Exception的子类RuntimeException除外RuntimeException的子类编译器要求强制处理 (try-catch或throws)不强制处理产生原因外部环境因素开发者无法完全避免程序逻辑错误开发者应通过编码避免处理策略必须显式处理以应对可预见的失败。应通过代码审查和防御性编程来根除而非捕获。典型示例IOException,SQLExceptionNullPointerException,ArrayIndexOutOfBoundsException注意重载和重写关于异常的不同处理重写时抛出的异常必须小于等于父类异常重载则无关自定义异常编码时可以自定义异常需继承自Exception。如果继承的是运行时异常使用时无需额外处理。如果继承的是检查异常使用时需要try-catch捕获或者throws向上抛。异常处理机制try-catch-finally异常处理的基础结构基本结构与执行流程try 块包裹可能抛出异常的代码。 catch 块捕获并处理特定类型的异常。一个 try 块后可以跟多个 catch 块。finally 块无论是否发生异常也无论 try 或 catch 中是否有 return 语句finally块中的代码几乎总会执行。它常用于资源清理如关闭连接、释放锁等。注意点慎用 finally 中的 return在 finally 块中使用 return 语句会覆盖 try 或 catch 块中的返回值可能导致异常信息丢失或返回错误的结果应极力避免try-with-resources自动资源管理try-with-resources 是 JDK7 引入的语法只要实现了 AutoCloseable 接口的资源流、连接、锁等都可以在 try 后声明执行完毕会自动关闭不用手动写 finally代码更简洁、避免漏关资源语法与工作原理资源在 try 关键字后的括号内声明和初始化。当 try 块执行完毕无论是正常结束还是因异常退出JVM会自动按照声明的逆序调用资源的 close() 方法。// 语法示例try(FileInputStreamfisnewFileInputStream(test.txt);BufferedReaderbrnewBufferedReader(newInputStreamReader(fis))){// 使用资源Stringlinebr.readLine();}catch(IOExceptione){// 处理异常}// 在这里br 和 fis 会被自动关闭无需 finally 块关键点资源声明在 try(…) 内部JVM 自动调用 close()关闭顺序与声明顺序相反支持同时声明多个资源用分号分隔所有InputStream/OutputStream、Connection、Statement、RandomAccessFile 等都已实现AutoCloseable自定义异常自定义异常的核心目的是让异常携带业务语义。核心要素一个优秀的自定义异常类通常包含以下要素继承体系业务异常通常继承 RuntimeException非检查型避免在方法签名上堆砌 throws保持代码整洁。强制处理异常继承 Exception检查型适用于调用方必须处理的场景如参数校验失败。错误码用于前端或调用方快速识别错误类型而不必依赖易变的错误消息文本。上下文信息如 userId, orderId 等帮助定位具体是哪条数据出了问题

更多文章