JAVA 异常 作者:马育民 • 2020-01-26 22:39 • 阅读:10064 # windows报错 在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境 **windows错误:** [](https://www.malaoshi.top/upload/pic/java/QQ20210628081744.png) [](https://www.malaoshi.top/upload/pic/java/QQ20210628081800.png) # 异常 在编程中,**异常(Exception)** 是指程序运行过程中发生的**非预期情况或错误**,这些情况会中断程序的正常执行流程。简单来说,异常就是程序“出问题”的信号,比如尝试除以零、访问不存在的文件、网络连接失败等。 ### 异常与错误的区别 在很多语境中,“异常”和“错误”会被混用,但严格来说: - **错误(Error)** 是一个更宽泛的概念,指任何不符合预期的情况(包括编译时错误、逻辑错误等)。 - **异常(Exception)** 通常特指 **运行时发生的可被捕获和处理的错误**,是程序运行中动态产生的问题。 ### 举例说明异常与错误 - 异常指的并 **不是语法错误**,语法错了,**编译不通过** - 执行 `1/0` 会抛出异常 - 用户试图打开一个不存在的文件等,会抛出异常 - 调用一个需要网络的函数,但设备断网了,函数可能抛出 `NetworkError`(网络异常)—— 这是异常。 ### 特点 1. **打断正常流程**:当异常发生时,程序不会继续按原顺序执行,而是会跳转到专门处理异常的代码块。 2. **包含错误信息**:异常通常携带描述错误的信息(如错误原因、发生位置等),帮助开发者定位问题。 3. **可被捕获和处理**:通过特定语法(如 `try/catch`)可以捕获异常,并编写逻辑修复问题或优雅地结束程序,避免程序崩溃。 ### 为什么需要处理异常? 没有异常处理的程序遇到错误时 **可能直接崩溃**,而通过捕获和处理异常: - 可以让程序在出错后继续运行(如网络超时后重试)。 - 可以向用户展示友好的错误提示(而非技术堆栈信息)。 - 可以记录错误日志,帮助开发者后续修复问题。 几乎所有现代编程语言(如 JavaScript/TypeScript、Java、Python 等)都提供了异常处理机制,核心思想都是“发现问题-捕获问题-处理问题”。 # Java处理异常 为了能够及时有效地处理程序中的运行错误,Java 专门引入了 **异常类**。 在Java等面向对象的编程语言中,**异常是一个类**,产生异常就是 **创建异常对象** ,并 **抛出** Java处理异常的方式是 **中断处理**。 **注意:** 异常指的并 **不是语法错误**,语法错了,**编译不通过** ,不会产生字节码文件,根本不能运行 # 异常分类 [](https://www.malaoshi.top/upload/0/0/1EF4s9SDvjFY.png) 1. 所有的异常都是从 `Throwable` 继承而来的,是所有异常的共同祖先 2. `Error` 是错误,程序无法处理,如: `OutOfMemoryError`,内存溢出 3. `Exception` 是异常,是程序本身可以处理的异常。 ### Exception 和 Error 的区别 Exception 是可以被处理的,而 Error 是没法处理的。 ### 运行时异常(非检查异常) 编译时 **不会检查(不报错)** ,在程序 **运行时 检查异常** `RuntimeException` 类及其子类 此类异常,一般是 **程序员犯的错误**,如:`1/0` ### 非运行时异常(检查异常) 在编译时 **会检查**,如果没有处理异常,**会编译失败** Exception子类中,除了 `RuntimeException`(及其子类) 的所有异常 此类异常,**不是程序员犯的错误**,是由外部导致的错误,比如:**读取的文件不存在** # Throwable 的常用方法 - ```public void printStackTrace()``` 打印异常的详细信息,包含了异常的类型,异常的原因,还包括异常出现的位置 在开发和调试阶段,都得使用printStackTrace。 - ```public String getMessage()``` 获取发生异常的原因 - ```public String toString()``` 获取异常的类型和异常描述信息(很少用) # 例子 先运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException ```java public class ExceptionDemo { public static void main(String[] args) { int i=1/0; int[] arr={1,2,3}; System.out.println(arr[4]); } } ``` 原文出处:http://malaoshi.top/show_1EF4s9rzx4Uf.html