资讯动态

Java异常的详细介绍

发布时间:2026/10/30 1:51:47 来源:尧图企业网站定制
大家在写 Java 代码时是不是经常被各种红色报错搞得头大 空指针、数组越界、除零错误…… 这些都是程序里的异常。 异常处理是 Java 开发最基础、最常用、面试最高频的知识点之一。 今天这篇文章我就带大家从 0 到 1 彻底搞懂 Java异常概念、体系、处理、流程、自定义异常一篇全搞定一、什么是异常简单一句话程序运行过程中发生的不正常行为就叫异常。就像人会生病一样代码写得再严谨也可能因为数据错误、网络问题、资源不足而出问题。Java 中常见的异常我们几乎都遇到过// 1. 算术异常除零错误System.out.println(10/0);// 2. 数组越界异常int[]arr{1,2,3};System.out.println(arr[100]);// 3. 空指针异常int[]arrnull;System.out.println(arr.length);每种异常Java 都用一个异常类来描述方便我们定位、处理。二、Java 异常体系结构Java 异常有一套非常清晰的继承体系顶层父类是 Throwable。Throwable├─Error错误JVM严重问题无法处理 └─Exception异常可捕获处理开发重点Throwable所有异常、错误的顶级父类。Error错误JVM 自己都解决不了的严重问题程序员无法通过 try-catch 处理。典型代表StackOverflowError栈溢出OutOfMemoryError内存溢出遇到 Error只能改代码逻辑没有别的办法。3. Exception异常我们平时说的 “异常”就是它可以通过代码捕获处理让程序继续运行。三、异常的两大分类按发生时机异常分为两大类编译时异常 和 运行时异常。编译时异常受检异常 Checked Exception编译期间就报错不处理无法运行必须显式捕获 或 声明抛出例子FileNotFoundException、IOException、CloneNotSupportedException// 编译直接报错必须处理 CloneNotSupportedExceptionOverridepublicPersonclone(){return(Person)super.clone();}运行时异常非受检异常 Unchecked ExceptionRuntimeException 及其子类编译不报错运行时才会触发例子NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException小提醒拼写错误、语法错误不是异常是编译错误四、异常处理核心思想处理异常有两种编程思想1.事前检查 先判断再操作。正常代码和错误代码混在一起结构混乱。2.先操作出错再处理 先执行业务代码遇到异常再捕获处理。 正常流程与异常流程分离代码更清晰。Java 异常处理的核心思想就是先操作出错再处理Java 异常 5 大关键字throw、try、catch、finally、throws五、异常的抛出throw主动手动抛出异常把错误信息告诉调用者。thrownew异常类(异常提示信息);示例获取数组元素并校验publicstaticintgetElement(int[]array,intindex){if(arraynull){thrownewNullPointerException(数组不能为 null);}if(index0||indexarray.length){thrownewArrayIndexOutOfBoundsException(数组下标越界);}returnarray[index];}throw 注意事项必须写在方法内部只能抛出 Exception 或其子类对象运行时异常可不用处理编译时异常必须处理异常抛出后后续代码不再执行六、异常的捕获与处理异常声明throws方法自己不处理异常甩锅给调用者。修饰符 返回值类型 方法名(参数列表)throws异常1,异常2...{}示例publicvoidopenConfig(Stringfilename)throwsFileNotFoundException{if(!filename.equals(config.ini)){thrownewFileNotFoundException(配置文件名称错误);}}throws 要点跟在方法参数列表之后可声明多个异常有父子关系只需要写父类调用者必须处理或继续 throws真正捕获try-catch-finally自己处理异常让程序不崩溃。try{// 可能出现异常的代码}catch(异常类型 e){// 捕获并处理异常}finally{// 无论是否异常一定会执行}示例publicstaticvoidmain(String[]args){try{int[]arr{1,2,3};System.out.println(arr[100]);}catch(ArrayIndexOutOfBoundsExceptione){e.printStackTrace();// 打印完整异常栈}System.out.println(程序继续执行);}catch 捕获规则按异常类型匹配捕获多个异常多个 catch 或 使用 并且 合并子类异常在前父类异常在后否则编译报错不推荐直接 catch (Exception)会吞掉异常必须执行finally无论是否异常、是否 returnfinally 一定执行publicstaticintfunc(){try{return10;}finally{return20;}}// 输出结果20开发规范绝对不要在 finally 里写 return七、异常处理流程1.异常不是停在当前方法而是向上传递2.本方法出现异常 → 寻找本层 catch3.没有匹配 catch → 抛给调用方法4.一直到 main 方法都没处理 → 交给 JVM → 程序终止八、自定义异常Java 内置异常不能满足所有业务场景我们可以自己定义异常。自定义步骤继承 Exception受检或 RuntimeException非受检实现带 String 参数的构造方法// 受检异常classUserNameExceptionextendsException{publicUserNameException(Stringmessage){super(message);}}// 非受检异常classPasswordExceptionextendsRuntimeException{publicPasswordException(Stringmessage){super(message);}}使用示例publicstaticvoidlogin(StringuserName,Stringpassword)throwsUserNameException{if(!admin.equals(userName)){thrownewUserNameException(用户名错误);}System.out.println(登录成功);}核心速记throw 方法内手动抛一个异常throws 方法上声明异常类型try 放可能异常的代码catch 捕获处理finally 一定执行关闭资源throw vs throws的比较throw 方法内抛对象throws 方法声明异常。总结异常体系Throwable → Error / Exception两类异常编译时必须处理、运行时可不处理处理流程throw 抛出 → throws 声明 → try-catch-finally 捕获自定义异常继承 Exception/RuntimeException 即可

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑