首页 > 代码库 > 5.异常丢失
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.异常丢失
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。