5.异常丢失
Posted 疯狂的肉包
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.异常丢失相关的知识,希望对你有一定的参考价值。
5.异常丢失
情况一:捕获异常,抛出新异常
这种情况在上一片文章中介绍过,下面的代码中f()函数中抛出的异常就会丢失,可以使用 Exception ex=new Exception(); ex.initCause(e);保留异常
try{ f(); }catch(Exception e){ throw new Exception(); }
情况二:finally中有return语句
f()中抛出的异常捕获不到
try{ f(); } finally {//try后边不一定要使用catch字句捕获异常 return; }
情况二:finally中抛出的异常会丢失之前的异常
try { try{ f(); }finally { g(); } }catch (Exception e){ e.printStackTrace(); }
总结:
1.只能捕获到g()中的异常,捕获不到f()中的异常
2.finally中最好不要抛出异常
异常限制
1.父类A中有方法f()-抛出异常E1 子类B中有方法f()--a.可以抛出异常E1 b.可以抛出异常E2(E1子类) c.不抛出异常
2.抛出子类异常可以捕获父类的异常,反过来就不行
例子:
class BaseException extends Exception{} class ChildException extends BaseException{} abstract class Inning{ public abstract void atBat() throws BaseException; } class StormInning extends Inning{ public void atBat()throws ChildException{throw new ChildException();} }
继承实现接口的异常处理---重要的知识点
interface Type1{ void f()throws CloneNotSupportedException; } interface Type2{ void f()throws InterruptedIOException; } class Type3 implements Type1,Type2{----如果只实现一个接口,可以不抛出异常,或者抛出接口中抛出的异常及其子类型 public void f(){} }; 这里的f()必须抛出Type1,Type2中的异常的交集(也可以不抛出异常)
异常的精细化处理
- 使用try块的嵌套,分级的捕获异常
-
class ReadFirstLine{ public ReadFirstLine() { try { BufferedReader in = null; try { in = new BufferedReader(new FileReader(new File("Test.iml"))); } catch (FileNotFoundException e) { e.printStackTrace();//不需要关闭文件 } String firstLine = in.readLine(); System.out.println(firstLine); } catch (Exception e) {
in.close();//关闭输出流 e.printStackTrace(); } finally { } } }
以上是关于5.异常丢失的主要内容,如果未能解决你的问题,请参考以下文章