异常指的就是程序在运行时出现错误时通知调用者的一种机制(运行时指的是程序已经编译通过得到 class 文件了,再由 JVM 执行过程中出现的错误)
try{ 有可能出现异常的语句; // 发生异常的代码,之后的代码是不会执行的 }[catch(异常类型 异常对象){ 出现异常后的处理行为; //e.printStackTrace(); 打印异常的信息 }][finally{ 异常的出口(用于处理善后工作, 会在最后执行(无论是否存在异常, finally中的代码一定都会执行到)) // 发生了异常会向上抛出,但是 finally 里面的代码永远会得到执行 // finally 里面适合做方法的资源关闭和收尾的工作 }] 其中 catch 和 finally都可以根据情况选择加或者不加。 则: try...catch 程序走到catch代码块,处理完毕后程序会继续执行 try...finally try...catch...finally try...catch...catch...finally try{ return 3; }catch(Exception e){ //方法遇到return就会形成返回值,后续在修改变量,不会改变返回值(假设finally中没有 return) return 4; }finally{ return 5; //finally 是唯一一个可以return一次之后还能 return 的代码块,可以修改方法的返回值 }异常处理流程:
程序先执行 try 中的代码 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配. 如果找到匹配的异常类型, 就会执行 catch 中的代码 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者. 无论是否找到匹配的异常类型, finally中的代码都会被执行到(在该方法结束之前执行). 如果上层调用者也没有处理的了异常, 就继续向上传递. 一直到 main方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止. 1.运行时的异常:可以编译通过,程序在运行期间报出来的异常; 2.编译期异常:这个异常必须要处理,否则没法编译通过。 Exception下面的子类除了 RuntimeException 以外都是编译期的异常。 在没有任何的处理的情况下异常对象会自动的抛给调用端,调用端接收到这个异常对象, 由于调用端也没有任何处理,继续向上抛出抛给jvm,jvm会打印这个异常信息。 try...catch 处理异常的特点: 1. try 内部发生异常下面的代码执行 2. 产生的异常对象被 catch 块里面的参数接收 3. catch 块未处理异常(如何处理要根据具体的业务要求) 4. 如果异常对象被catch未处理就不会向上抛出 5. 若干个异常对象被处理了,异常后面的代码就会正常的执行 6. 调用端不会感知到异常的产生(因为没有向上抛出异常对象),后面的代码正常执行1、自定义异常通常会继承自 Exception 或者 RuntimeException 2、继承自 Exception 的异常默认是受查异常 3、继承自 Error 或 RuntimeException 的异常默认是非受查异常
如果一段代码可能抛出受查异常,那么必须显式进行处理 显示处理: a) 使用 try catch 包裹起来 b) 在方法上加上异常说明,相当于将处理动作交给上级调用者
:异常
