美文网首页青春韶华
java异常的链化

java异常的链化

作者: 星空无痕 | 来源:发表于2022-10-28 20:43 被阅读0次

       在一些大型的,模块化的软件开发中,一旦一个地方发生异常,则如骨牌效应一样,将导致一连串的异常。假设B模块完成自己的逻辑需要调用A模块的方法,如果A模块发生异常,则B也将不能完成而发生异常,但是B在抛出异常时,会将A的异常信息掩盖掉,这将使得异常的根源信息丢失。异常的链化可以将多个模块的异常串联起来,使得异常信息不会丢失。

        异常链化:以一个异常对象为参数构造新的异常对象。新的异对象将包含先前异常的信息。这项技术主要是异常类的一个带Throwable参数的函数来实现的。这个当做参数的异常,我们叫它根源异常(cause)。

        查看Throwable类源码,可以发现里面有一个Throwable字段cause,就是它保存了构造时传递的根源异常参数。这种设计和链表的结点类设计如出一辙,因此形成链也是自然的了。

    public class Throwable implements Serializable {

        private Throwable cause = this;

        public Throwable(String message, Throwable cause) {

            fillInStackTrace();

            detailMessage = message;

            this.cause = cause;

        }

        public Throwable(Throwable cause) {

            fillInStackTrace();

            detailMessage = (cause == null ? null : cause.toString());

            this.cause = cause;

        }

        //........

    }

        下面是一个例子,演示了异常的链化:从命令行输入2个int,将他们相加,输出。输入的数不是int,则导致getInputNumbers异常,从而导致add函数异常,则可以在add函数中抛出一个链化的异常。

    public static void main(String[] args){

        System.out.println("请输入2个加数");

        int result;

        try{

            result = add();

            System.out.println("结果:"+result);

        } catch (Exception e){

            e.printStackTrace();

        }

    }

    //获取输入的2个整数返回

    private static List<Integer> getInputNumbers(){

        List<Integer> nums = new ArrayList<>();

        Scanner scan = new Scanner(System.in);

        try {

            int num1 = scan.nextInt();

            int num2 = scan.nextInt();

            nums.add(new Integer(num1));

            nums.add(new Integer(num2));

        }catch(InputMismatchException immExp){

            throw immExp;

        }finally {

            scan.close();

        }

        return nums;

    }

    //执行加法计算

    private static int add() throws Exception{

        int result;

        try {

            List<Integer> nums =getInputNumbers();

            result = nums.get(0)  + nums.get(1);

        }catch(InputMismatchException immExp){

            throw new Exception("计算失败",immExp);  /链化:以一个异常对象为参数构造新的异常对象。

        }

        return  result;

    }

    /*

    请输入2个加数

    r 1

    java.lang.Exception: 计算失败

        at practise.ExceptionTest.add(ExceptionTest.java:53)

        at practise.ExceptionTest.main(ExceptionTest.java:18)

    Caused by: java.util.InputMismatchException

        at java.util.Scanner.throwFor(Scanner.java:864)

        at java.util.Scanner.next(Scanner.java:1485)

        at java.util.Scanner.nextInt(Scanner.java:2117)

        at java.util.Scanner.nextInt(Scanner.java:2076)

        at practise.ExceptionTest.getInputNumbers(ExceptionTest.java:30)

        at practise.ExceptionTest.add(ExceptionTest.java:48)

        ... 1 more

    */

相关文章

  • 异常处理

    JAVA严格的异常处理机制和类型检查机制 异常处理手贱异常非手贱异常 异常链处理 异常是在程序出错的时候能知道程序...

  • java中的异常链

    1.自定义新的异常 2.测试异常链 3.运行结果

  • Java基础(三)

    Java异常;反射;注解;内部类;泛型;序列化;复制; JAVA 异常分类及处理 概念 如果某个方法不能按照正常的...

  • 12.通过异常处理错误

    在java中,异常分为免检异常和必检异常必检异常就是编译时被强制检查的异常异常链:通常在捕获一个异常后抛出另一个异...

  • 安卓和java常见异常总结

    常见异常 java.lang.NullPointerException:空指针异常简单地说就是调用了未经初始化的对...

  • 常见异常与举例

    1、Java.lang.NullPointerException空指针异常,此异常主要是调用了未经初始化的对象或者...

  • Java设计模式之职责链模式

    Java设计模式之职责链模式 前几天复习java的异常处理时,接触到了责任链模式。在企业级应用中,从前台发过来的请...

  • Java 异常链被覆盖

    一、前言 问题:正式服务器上有一个BUG,但是本地复现不了。于是查看日志,发现日志居然没有打印有效的错误提示,都是...

  • Java 异常分析

    本文是对以下内容的分析: Java异常设计 Java 异常分类 Java异常可以告诉什么问题 Java异常处理最佳...

  • 廖雪峰Java 读书笔记 (二) 异常处理

    1. Java的异常 Java使用异常来表示错误,并通过try ... catch捕获异常; Java的异常是cl...

网友评论

    本文标题:java异常的链化

    本文链接:https://www.haomeiwen.com/subject/horctdtx.html