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 {
    
            }
        }
    }
时间: 2024-08-04 19:52:42

5.异常丢失的相关文章

java异常丢失及异常链

异常丢失的情况: 先定义三个异常: public class ExceptionA extends Exception { public ExceptionA(String str) { super(); } } public class ExceptionB extends ExceptionA { public ExceptionB(String str) { super(str); } } public class ExceptionC extends ExceptionA { publi

JAVA finally字句的异常丢失和返回值覆盖解析

转载:http://blog.csdn.net/sureyonder/article/details/5560538 Java虚拟机在每个try语句块和与其相关的catch子句的结尾 处都会“调用”finally子句的子例程.实际上,finally子句在方法内部的表现很象“微型子例程”.finally子句正常结束后-指的是finally子句中最后一条语句正常执行完毕,不包括抛出异常,或执行return.continue.break等情况,隶属于这个finally子句的微型子例程执行“返回”操作.

《java编程思想》:异常丢失

finally子句的不恰当使用,会造成异常的丢失,此处列举两种典型的错误使用示例.编程中要避免这种情况 示例一: try{ throw new ExceptionA(); }finally{ throw new ExceptionB(); } 缺少catch语句,缺少对A异常的捕获,导致A异常丢失 示例二: public void test(){ try{ throw new ExceptionA(); }finally{ return; } } 缺少catch语句,缺少对A异常的捕获,fina

Java异常-可能会出现异常丢失的情况&finally

finally的两种特性: 对于没有垃圾回收和析构函数自动调用机制的语言来说,Java中的finally非常重要.它能使程序员保证: 1.无论异常是否被抛出,finally子句总能被执行.这个特性我们可以用来解决以下问题:Java的异常不允许我们回到异常抛出的地点时,该如何应对?把try块放在循环里,建立了一个"程序继续执行之前必须要达到"的条件.还可以加入一个static类型的计数器之类的装置,使循环在放弃之前能尝试一定的次数,这将使程序的健壮性更上一个台阶. 2.无论try块发生了

finally引起的异常丢失问题

finally引起的异常丢失问题 场景一 public void loseException() throws Exception { try { throw new Exception("Exception A"); } finally { throw new Exception("Exception B"); } } 调用 ` loseException()` 你会发现,Exception A 被 Exception B覆盖掉了.这是非常严重的设计缺陷,并且很难

java异常处理(父子异常的处理)

我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习<Thinking in Java>,我才明白其中的道理,现在我再来温习一下. 一.子类方法只能抛出父类方法的异常或者是其子异常 对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常 package thinkinginjava; public abst

Java异常总结

http://blog.csdn.net/hguisu/article/details/6155636 [-] 1 引子 2JAVA异常 4处理异常机制 1 捕获异常trycatch 和 finally try-catch语句 trycatch-finally语句 try-catch-finally 规则异常处理语句的语法规则 trycatchfinally语句块的执行顺序 2 抛出异常 throws抛出异常 使用throw抛出异常 4 Throwable类中的常用方法 5Java常见异常 ru

浅谈java异常[Exception]

本文转自:focusJ 一. 异常的定义 在<java编程思想>中这样定义 异常:阻止当前方法或作用域继续执行的问题.虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常.绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败.之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意. 记得当初学习java的时候,异常总是搞不太清楚,不知道这个异常是什么意思,为什么会有这个机制?但是随着知识的积累逐渐也

Atitit 异常机制与异常处理的原理与概论

1.1. Atitit.异常机制的设计原理.docx1 1.2. 终止模式  vs 恢复模式(asp1 1.3. 处理反射方法的异常1 1.4. 重新抛出异常和异常链2 1.5. Finally 异常丢失的处理3 1.1. Atitit.异常机制的设计原理.docx JVM看Exception本质.java的ex设计throry 1.2. 终止模式  vs 恢复模式(asp Java对于异常的处理采取的是终止模式,一旦发生问题,程序将不能继续执行,与之对应的是恢复模式,就是当异常抛出时,程序能够