文章目录
- 异常和错误
- java异常的分类:
- 非运行时异常
- 运行时异常
- 受检异常(非运行时异常)如何处理?
- 1、try catch finally
- 为什么要用try catch finally
- 2、throws
- Throw和Throws的区别
- JVM是如何处理异常的
- try-catch-finally中哪个部分可以省略
————————————————————————————————
异常和错误
下面这就是异常(exception)
错误:(Error)是JVM产生和抛出的,一般情况下在编译器上看不到错误
下面这种就是Error(这个是栈溢出)
java异常的分类:
java异常可以分为:受检异常(非运行时异常)、非受检异常(运行时异常)
非运行时异常
受检异常(非运行时异常)
——>(代码从语法角度必须处理的异常,如果不处理,程序不能编译)
——>在编译器当中报错,需要我们解决该异常才能继续执行
非运行时异常(受检异常) :是RuntimeException以外的异常,类型上都是属于Exception类,这些异常必须处理。
常见受检异常:SQLException(访问关系数据库产生的异常),IOException(在读取文件时产生的异常),ClassNotFoundException(试图使用一个不存在的类),或者程序员自定义的异常。
运行时异常
非受检异常(运行时异常)
——>(代理的逻辑错误产生的)
——>在编译器当中不报出异常,在程序运行阶段报出异常
运行时异常(非受检异常) :都是由RuntimeException类(—>是Exception的一个子类)或者其子类产生的,这些异常程序可以选择处理,或者选择不处理。
常见非受检异常:NullPointerException(空指针访问),IndexOutOfBoundsException(数组角标越界),ArithmeticException(数学运算中除以0的情况),IIIegalArgumenException(传递给方法的参数非法或不合适)
受检异常(非运行时异常)如何处理?
1、try catch finally
try:尝试运行
catch:运行不成功,触发
finally:一定会执行的代码(不管是成功还是失败)
- finally:无论try是否成功,finally一定会执行
- finally通常来做资源清除工作,并比如关闭文件等等
为什么要用try catch finally
为了:解决异常:一旦使用了try…catch,那么即使出现异常,后续代码也能继续执行代码
2、throws
抛出异常,表示该方法不处理这个异常,交给 该 方法的调用者 去处理此异常(main方法处理此异常)
throw——自定义异常的关键字
注意:
JDK所抛出的所有的异常的父类都是Expectation类
Throw和Throws的区别
Throws:
- 用来声明一个方法可能产生的所有异常,不能做任何处理而是将异常往上传,谁调用就抛给谁
- 用在方法声明后面,跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 可以抛出异常,由该方法的调用者来处理
- 表示出现异常的一种可能性,并不一定会发生异常
Throw:
- 抛出的是一个具体的异常类型
- 用在方法体内,跟的是异常的对象名
- 只能抛出一个异常对象名
- 表示抛出异常,由方法体内的语句处理
- throw抛出了异常,执行,throw则一定会抛出某种异常
JVM是如何处理异常的
在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给JVM的过程称为抛出异常。可能 有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。
JVM会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。当JVM发现可 以处理异常的代码时,会把发生的异常传递给它。如果JVM没有找到可以处理该异常的代码块,JVM就 会将该异常转交给默认的异常处理器(默认处理器为JVM的一部分),默认异常处理器打印岀异常信息 并终止应用程序。
try-catch-finally中哪个部分可以省略
try只适合处理运行时异常,try+catch适合处理运行时异常 +普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译 器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略。