导图社区 计算机-java异常分析
计算机,java异常信息,使用场景,注意事项
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
异常
what
概念
由于各种不期而至的情况,导致程序中断运行的一种指令流
模型
和哪个知识相关联
throw关键字可以与return关键字进行对比。return代表正常退出,throw代表异常退出;return的返回位置是确定的,就是上一级调用者,而throw后执行哪行代码则经常是不确定的,由异常处理机制动态确定
分类/层级
Throwable
Error
表示系统错误或资源耗尽,由Java系统自己使用,应用程序不应抛出和处理
Exception
未受检异常
RuntimeException及其子类
受检异常
对于受检异常,Java会强制要求程序员进行处理,否则会有编译错误,而对于未受检异常则没有这个要求
How
怎么处理异常
异常机制来统一处理
可以由系统触发,也可以由程序通过throw语句触发
首先创建一个异常对象,这里是类NullPointerException的对象,然后查找看谁能处理这个异常
一般逻辑
如果自己知道怎么处理异常,就进行处理
如果可以通过程序自动解决,就自动解决
如果异常可以被自己解决,就不需要再向上报告
如果自己不能完全解决,就应该向上报告
如果自己有额外信息可以提供,有助于分析和解决问题,就应该提供,可以以原异常为cause重新抛出一个异常
如果异常不能自动解决,则应该输出详细的异常链和异常栈到日志
具体方法
try/catch匹配
重新抛出异常throw
在catch块内处理完后,可以重新抛出异常,异常可以是原来的,也可以是新建的
当前Exception作为cause传递给了下一个Exception,这样就形成了一个异常链,捕获到下一个Exception的代码可以通过getCause()得到当前Exception
finally
finally内的代码不管有无异常发生,都会执行
如果没有异常发生,在try内的代码执行结束后执行
如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
如果有异常发生但没被捕获,则在异常被抛给上层之前执行
try-with-resources
public static void useResource() throws Exception { try(AutoCloseable r = new FileInputStream("hello")) { //创建资源 //使用资源 } }
这种语法针对实现了java.lang.AutoCloseable接口的对象,调用资源的关闭方法
资源可以定义多个,以分号分隔
throws
throws跟在方法的括号后面,可以声明多个异常,以逗号分隔
如果一个方法内调用了另一个声明抛出受检异常的方法,则必须处理这些受检异常,处理的方式既可以是catch,也可以是继续使用throws
怎么自定义异常
一般是继承Exception或者它的某个子类。如果父类是RuntimeException或它的某个子类,则自定义异常也是未受检异常;如果是Exception或Exception的其他子类,则自定义异常是受检异常
Where
能用场景
真正出现异常的时候,应该抛出异常,而不是返回特殊值
不能用场景
异常不能代替正常的条件判断
Why
其他点的剖析
为什么要重新抛出
因为当前代码不能够完全处理该异常,需要调用者进一步处理
为什么要抛出一个新的异常
因为当前异常不太合适。不合适可能是信息不够,需要补充一些新信息;还可能是过于细节,不便于调用者理解和使用,如果调用者对细节感兴趣,还可以继续通过getCause()获取到原始异常