代码优雅之道:简化异常处理语句

本文探讨如何优化Java代码中的异常处理,通过静态方法和自定义Throws对象实现代码简化。介绍了两种优化方式:1) 使用静态方法封装异常处理,如SupplierWithThrow、RunnableWithThrow等接口,减少了代码冗余。2) 利用Throws对象,如RunnableWithThrow,提供更灵活的异常处理方式,同时指出可能的内存占用问题。这两种方法旨在使代码更加优雅和易于阅读。
摘要由CSDN通过智能技术生成

代码优雅之道:简化异常处理语句

先来个实际效果

写代码时难免会遇到异常, 对待异常有的时候直接抛出, 有的时候需要实际的处理, 例如下面这个

在这里插入图片描述

MessageDigest 里面是有MD5方法的, 那么这个异常完全没必要, 那就在方法内部对异常进行处理, 然后就变成了下面这样.

    /**
     * 获取一个byte[]的md5值
     *
     * @param data 待转换的数据
     * @return md5 byte[]的MD5值
     */
    public static String getMD5(byte[] data) {
   
        MessageDigest md5;
        try {
   
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
   
            throw new RuntimeException("MessageDigest 未发现 MD5 方法", e);
        }
        byte[] digest = md5.digest(data);
        return new BigInteger(1, digest).toString(16);
    }

本来三行就能写好的代码, 因为个异常处理变得臃肿, 难看, 那么有没有办法把它变得优雅呢?

答案肯定有, 否则就不会有这篇文章了!

为了节省大家的时间, 首先来展示下优化后的代码.

    /**
     * 获取一个byte[]的md5值
     *
     * @param data 待转换的数据
     * @return md5 byte[]的MD5值
     */
    public static String getMD5(byte[] data) {
   
        final MessageDigest md5 = Throws.fun("MD5", MessageDigest::getInstance).runtimeExp("MessageDigest 未发现 MD5 方法").value();
        byte[] digest = md5.digest(data);
        return new BigInteger(1, digest).toString(16);
    }

3行搞定真是很开心!

其实不只是上面的优化, 也能做到下面几组的优化

第一组优化

   // 源代码
   String s = null;
   try {
   
      s = ConfigTest.newHaha();
   } catch (NoSuchMethodException e) {
   
      log.error("", e);
   }

   // == SimpleCode优化
   String s = SimpleCode.ignoreException(ConfigTest::newHaha);

   // == Throws 优化
   String s = Throws.sup(ConfigTest::newHaha).logThrowable().value();

第二组优化

   try {
   
      AppContext.init()
   } catch (ConfigException e) {
   
      e.printStackTrace();
   }

   // 等价于
   
   Throws.con(100, AppContext::init).catchToPrintStackTrace();
   
   // 或等价于
   
   Throws.run(() -> AppContext.init()).catchToPrintStackTrace();

异常语句优化思路

在写工具类的时候, 很多情况下, 对异常的处理也就是个打印现场工作, 即便写业务类也就是个打印现场, 既然工作都差不多, 那就可以想办法封装起来, 优化代码, 又便于阅读.

首先, 说到封装try catch, 能够想到的就是函数式接口lambda表达式, 这真是JAVA的两大神器啊!

然后, JDK自带的函数式接口是没有办法处理异常的, 那就把之前说到的几个带有异常抛出的几个函数式接口拿出来.

(itertrm)

那么, 就很容易想到一种方式, 通过静态方法, 将lambda表达式当作参数传进去, 在静态方法里面处理异常, 这样就可以简化异常的代码.

其次, 讲到 try catch 比较好的处理方式, 我想到的是JS里面的 Promise, 它的处理方式给我带来了很多灵感.

接下来, 就通过代码实际操作一下吧!

异常语句优化方式1-静态方法优化

由于涉及到好几个lambda表达式的优化, 整体代码较多, 下面只是展示下 SupplierWithThrow 的优化方式

RunnableWithThrow : 带有抛出异常的 Runnable 接口

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆光影者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值