- 异常的作用:增强程序的健壮性
- 异常在java中以类的形式存在,每一个 异常类 都可以创建 异常对象。
- 异常的结构:
- Error:Error 类及其子类表示严重的系统错误,通常是无法通过代码来修复的,最终导致虚拟机停止,例如内存溢出(OutOfMemoryError)、虚拟机错误(VirtualMachineError)等。程序一般不会捕获和处理 Error 类及其子类的异常,因为这些异常通常表示系统级别的问题。
- Exception:Exception 类及其子类表示程序运行过程中出现的可处理的异常情况。在编写程序时,我们可以通过 try-catch 块来捕获并处理这些异常,避免程序崩溃。Exception 类下又分为两个主要的子类:
- 1、运行时异常:RuntimeException 类及其子类表示运行时异常,这些异常通常是程序逻辑错误导致的,例如空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)等。在编写代码时,不需要显式地在方法声明中指定可能抛出的运行时异常,也不强制要求在调用方捕获这些异常,因此运行时异常也称为非检查异常(unchecked exception)。
- 2、编译时异常:非RuntimeException 类及其子类表示非运行时异常,这些异常通常是编译时异常,强制处理:调用方法时要么捕获这些异常,要么继续声明抛出这些异常,否则代码将无法通过编译。例如文件找不到异常(FileNotFoundException)、IO 异常(IOException)等。
- 异常的处理方式:
- 1、throws 继续抛出异常
- throw+对象=抛出当前该类型的对象
- 方法 + throws +异常列表 //异常列表,定义当前方法要抛出的异常类
- 2、try catch 捕获异常
- try: 可能会报错的代码 ,某一行出现异常,该行后面的代码不会执行 。
- catch: JDK8的新特性:catch() 异常间可以自小到大用“ | ”分割;捕捉到,不再走之后的catch块
- finally:必须写,无论如何都要走finally里面的;System.exit(0),finally子句失效;抓住异常,运行try catch块外面之后的代码,否则不运行。
- return:捕获异常时出现return ,也要先走完finally再走return结束方法。
- 1、throws 继续抛出异常
- 自定义异常:
- 继承RuntimeException,重写getMessage toString方法
- getMessage: String 输出异常类的报错信息
- toString: Strng 类名+异常
- printStackTrace: void 类名+异常+(异常位置)
return情况:
情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} return; (try中无异常时)
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。
throw 和 throws 的区别:
1、throws 跟在方法声明后面,后面跟的是异常类名
throw 用在方法体内,后面跟的是异常类对象名
2、throws 可以跟多个异常类名,用逗号隔开
throw 只能抛出一个异常对象名
3、throws 表示抛出异常,由该方法的调用者来处理
throw 表示抛出异常,由该方法体内的语句来处理
4、throws表示有出现异常的可能性,并不一定出现这些异常
throw则是抛出了异常,执行throw一定出现了某种异常
throw 类似于return ,如果没有catch ,finally里需要return,