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 {
    public ExceptionC(String str) {
        super(str);
    }
}

  接着定义一个测试类:

public class NeverCaught {
    static void f() throws ExceptionB{
        throw new ExceptionB("exception b");
    }

    static void g() throws ExceptionC {
        try {
            f();
        } catch (ExceptionB e) {
            ExceptionC c = new ExceptionC("exception a");
            throw c;
        }
    }

    public static void main(String[] args) {
            try {
                g();
            } catch (ExceptionC e) {
                e.printStackTrace();
            }
    }

}

  输出的结果:

exception.ExceptionC
at exception.NeverCaught.g(NeverCaught.java:12)
at exception.NeverCaught.main(NeverCaught.java:19)

  打印的异常信息中丢了ExceptionB的信息。如果希望能同时输出ExceptionB和ExceptionC的信息,就需要用到异常链。

  异常链主要作用就是:保存异常信息,在抛出另外一个异常的同时不丢失原来的异常。

  下面的代码将示例以两种方法实现异常链向上抛出异常。

public class NeverCaught {
    static void f() throws ExceptionB{
        throw new ExceptionB("exception b");
    }

    static void g() throws ExceptionC {
        try {
            f();
        } catch (ExceptionB e) {
            ExceptionC c = new ExceptionC("exception a");
            //异常链
            c.initCause(e);
            //另外一种实现方式
       // throw new Exception("exception a", e);
            throw c;
        }
    }

    public static void main(String[] args) {
            try {
                g();
            } catch (ExceptionC e) {
                e.printStackTrace();
            }
    }

}

  需要注意的是:

  只有Error,Exception,RunimeException提供了带cause参数的构造器,其他的所以异常就只有通过initCause()来设置cause了。自己定义的异常提供了带cause参数的构造器时,也可以正常设置。

时间: 2024-10-12 13:18:33

java异常丢失及异常链的相关文章

Java深入理解之异常

Java的基本理念是"结构不佳的代码不能运行" 为什么要使用异常? 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率 .异常不是程序语法错误,异常,就是在正常语法的代码运行过程中出现如 一楼所说的情况,如果不进行异常处理,那程序直接结束了,之所以捕获异常,是让你可以有发生错误补救的机会. 异常定义:异常情形是指阻止当前方法或者作用域继续执行的问题.在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以"正常&qu

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

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

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

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

程序有异常不知道咋办?来学习Java异常处理知识点和异常链机制

Java异常处理知识点和异常链机制异常处理是程序设计中一个非常重要的方面,毕竟人无完人,不可能永不犯错,程序中有异常是很正常的, Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,下面是我对Java异常知识和异常链的一个总结.一.Java异常的基础知识异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.有些异常需要做处理,有些则不需要捕获处理,在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免.不可预测的情况则在考虑异常发生时如何处理.J

《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异常处理(父子异常的处理)

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

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的基本理念是"结构不佳的代码不能运行"!!!!! 大成若缺,其用不弊. 大盈若冲,其用不穷. 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发生,我们所需要做的就是避免那些能够避免的异常,处理那些不能避免的异常.这里我将记录如何利用异常还程序一个"完美世界". 一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我

Java面向对象中的异常

Java中的异常和错误Java 中的异常机制,更好地提升程序的健壮性 throwable 为顶级, Error 和 Exception Error :虚拟机错误,内存溢出,线程死锁 Exception : RuntimeException 为空指针异常,数组下标越界异常,算数异常,类型转换异常等,IO异常( IOException ),SQL异常( SQLException ). 异常处理,在 Java 中异常处理机制为: 抛出异常 和 捕捉异常 异常的描述: class ExceptionDe