异常:为何编译正常,上线就出问题?
异常
1、finally(无论异常是否发生都执行)
finally包含哪些处理逻辑
- IO流的关闭操作(不关闭会存在端口,传输占用资源)
类比return:
(1) 返回值;
(2)中断或关闭当前程序(考查多个return的执行情况, finally前的return值放置于内存区,执行中若finally中存在对return对值进行处理,则返回处理后的值—— finally中的return优先级高于try中的return),下例返回num=100.
情况一: try中有return,finally中没有return
情况二: : try和finally中均有return
情况三:finally中改变返回值num
finally位于try-catch结构内部,num存于内存中,执行完finally后新赋值的num没有返回,故返回的num值仍为10——作用域问题。
情况四:将num的值包装在Num类中——函数传递
finally中没有返回语句,但改变了值,若数据为引用类型(传递函数),则语句返回值变化;若定义的是基本类型,则值不改变。
面试问题:
* try-catch块中存在return语句,是否还执行finally语句,若执行,说出执行顺序。
* try-catch-finally块中,finally块唯一不执行的情况是什么?*
2、异常出现时可以使用try -catch- finally形式处理,除此之外也可以在方法中向外抛出——throw
(若在方法中存在多个方法之间的调用,若每个方法出包含了异常情况,使用throws统一处理异常优于每个方法中都进行try-catch操作)
main 函数: throws Exception__ 声明异常
稳妥办法:每个方法中都进行异常处理;
偷懒办法: 判断调用过程中外层调用是否有异常处理,有则直接throws,否则使用try-catch.
异常抛出自定义: `throw new Exception("output error")`
或定义异常类 extends Exception
1、继承Exception类;
2、自定义实现构造方法;
3、需要使用的时候,使用throw new自定义异常的名称;
什么时候需要使用到自定义异常: 一般不需要,但当业务需求异常格式规范统一、需自己实现的时候时需要;
父类:
Object --> Throwable --> Exception \ Error (系统级错误)–> Exception中包含Checked(必须处理)\RuntimeException(运行)