哈喽各位 CSDN 小伙伴前面学完了面向对象、抽象类与接口今天继续记录 Java 的异常知识点。写代码的时候总会遇到各种各样报错有些是语法写错编译直接报错还有一类是程序运行起来之后才出现的错误比如空指针、数组越界。这就是 Java 里的异常。异常处理就是用来优雅捕获、处理运行时错误防止整个程序直接崩溃退出也是项目开发里必备的能力。一、什么是异常异常 程序运行过程中发生的非正常情况。区分两个概念错误 (Error)属于严重系统级问题比如内存溢出程序无法处理。异常 (Exception)代码运行产生的可处理问题我们可以使用异常机制捕获处理。Java 中异常体系顶层父类ThrowableError系统错误不处理Exception异常分为两大类编译期异常受检异常除RuntimeException以外的异常。编译器强制要求处理不写处理代码就编译报错。运行时异常非受检异常RuntimeException编译不会报错运行才抛出。比如空指针NullPointerException、数组索引越界ArrayIndexOutOfBoundsException。代码书写规范可以尽量避免。二、异常的捕获try-catch-finally语法try{// 可能会出现异常的代码}catch(异常类型 e){// 捕获到对应异常后执行的处理逻辑}finally{// 无论是否发生异常最后一定会执行除非JVM直接退出}执行流程try 里面代码正常执行如果没有异常try 执行完毕跳过 catch执行 finally。try 里面代码抛出异常异常后面的代码不会执行直接跳转到匹配的 catch 块执行再执行 finally。多 catch 写法捕获多种不同异常从小到大写子类异常写前面父类异常放后面publicclassExceptionDemo{publicstaticvoidmain(String[]args){try{int[]arr{1,2,3};System.out.println(arr[10]);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println(数组下标越界);}catch(Exceptione){System.out.println(出现未知异常);}finally{System.out.println(finally执行);}}}finally 注意点finally 作用用来释放资源关闭 IO 流、数据库连接等。一般情况下无论异常存不存在finally部分代码都会被执行。特例如果在 try/catch 中执行 System.exit(0);JVM 直接终止finally 不会执行。三、异常的抛出 throws 和 throwthrows 写在方法声明上throws声明这个方法可能抛出某种异常把异常交给调用者去处理。作用告诉调用方调用这个方法要小心这个异常。importjava.io.FileNotFoundException;publicclassThrowsDemo{// 声明该方法可能抛出编译期异常publicstaticvoidtest()throwsFileNotFoundException{}}注意throws 只是声明异常不会真正抛出异常对象。运行时异常不需要 throws 声明。throw 在方法体内手动抛出异常对象throw手动创建异常对象并且把这个异常抛出。publicclassThrowDemo{publicstaticvoidmain(String[]args){Stringstrnull;if(strnull){thrownewNullPointerException(传入的值不能为null);}}}简单区分throws在方法定义声明【可能出现什么异常】throw在方法内部主动抛出【一个具体异常实例】四、异常处理的两种选择try-catch自己捕获并处理异常程序捕获后可以继续往下运行。throws不处理向上抛交给调用这个方法的人处理如果一直向上抛到 main 方法异常就会交给 JVM程序直接终止。五、自定义异常当 JDK 自带的异常无法描述业务场景我们可以自己写异常类。自定义编译期异常继承Exception自定义运行时异常继承RuntimeException不用 throws 声明自定义异常类代码//自定义运行时异常publicclassAgeExceptionextendsRuntimeException{publicAgeException(){}publicAgeException(Stringmsg){super(msg);}}测试使用代码publicclassCustomExceptionTest{publicstaticvoidcheckAge(intage){if(age0||age120){thrownewAgeException(年龄不合法);}else{System.out.println(年龄校验通过);}}publicstaticvoidmain(String[]args){checkAge(200);}}六、学习小结Error 是系统级错误不用处理Exception 才是我们要处理的异常。try-catch 用来捕获处理异常finally 用于资源释放。throws 声明异常throw 主动抛出异常实例。运行时异常编译不报错大多是代码书写问题编译期异常强制要求处理。自定义异常用于描述项目里业务专属的错误场景让报错信息更加清晰。学习感想最开始学习的时候分不清 throws 和 throw也会出现多 catch 顺序写反的编译报错面对这种情况我们要梳理代码运行逻辑一一排查问题并且修改代码。异常不是用来掩盖 bug 的不能滥用 try-catch。能提前判断的错误优先用 if 判断无法预判的运行问题再使用异常机制处理。