java 手工产生 try_如何优雅的实现 try/catch 异常块?

本文探讨如何在Java中优雅地处理try/catch异常块,利用行为参数化、Lambda表达式和函数式接口的概念,避免繁琐的异常处理代码。通过示例展示了如何将异常处理与业务逻辑分离,提高代码的可读性和简洁性。
摘要由CSDN通过智能技术生成

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

497092670d5dd5b8b39099af154e87dc.png

关注公众号后台回复pay或mall获取实战项目资料视频

作者 :意必固我

来源 :cnblogs.com/liruilong/p/13403963.html

在项目中,我们会遇到异常处理,对于运行时异常,需要我们自己判断处理。对于受检异常,需要我们主动处理。

但是繁琐的try{}caht嵌套在代码里,看着很不舒服,这里我们不讨论性能,就代码来讲,来看看如何将他隐藏起来。原理是不变的。变得是写法。下面我们来看如何优雅的处理异常块。

在这之前。你需要知道以下几个概念:

行为参数化:

是java8提出的,函数式编程的一种思想,通过把代码包装为参数传递行为,即把代码逻辑包装为一个参数,传到方法里。

Lambda表达式:

java8提出:Lambda表达式理解为简洁的表示可传递的匿名函数的一种方式,它没有名称,但它有函数体,参数列表,返回类型。可以抛出一个异常类型。包装代码逻辑为参数即使用Lambda表达式。

函数式接口:

本质上是只有一个抽象方法的普通接口,可以被隐式的转换为Lambda表达式,需要用注解定义(@FunctionalInterface)。默认方法和静态方法可以不属于抽象方法,可以在函数式接口中定义。

8724e2ea5202bfbb3c35ad9a56192014.png

如果函数式接口中额外定义多个抽象方法,那么这些抽象方法签名必须和Object的public方法一样,接口最终有确定的类实现, 而类的最终父类是Object。因此函数式接口可以定义Object的public方法。

b4a80a0b607382ac098e5dcdc0cef860.png

这句代码想来小伙伴都不陌生。这是一个受检异常,需要抛出一个ClassNotFoundException。

正常的写法:

940673643cb7eb914880c33015a1deb3.png

9b968864317bb229d1cfe97ba14884bc.png

嗯,我们来看具体的实现:很简单,我们要做的,即把Class> clazz = Class.forName("类名");当做一种行为去处理,接受一个String ,得到一个Class,所以我们要定义一个函数接口,描述这种行为。

0175da857cc7d144231549ccfc5f6ef3.png

这里,因为我们的行为需要抛出异常。所以在接口里也抛出异常。

然后,我们需要定义一个方法,将我们的行为作为参数传进去,同时,捕获一下我们的异常。

68f4fb059ef143d7d1f09db24020f4d9.png

然后,我们可以调用我们的方法classFind方法,

b0599627889ad2c31495a141096b5646.png

当然。其实这种思想并不简单的可以做捕获异常的处理,

我们来看一个Demo->文本文件转换为字符串:

在我看来;将文本文件转换为字符串,我们需要使用高级流包装低级流,然后做缓存读出来。这里,我们不可避免的会遇到异常处理,流的关闭等操作,下面我们将这些代码都异常起来。专心写读的逻辑即可。

我的思路:

我对java IO用的不是很熟,大家有好的方法请留言,相互学习:

FileInputStream fileInputStream = new FileInputStream(file))

InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream))

BufferedReader bufferedReader = new BufferedReader(inputStreamReader))

String str = bufferedReader.readLine()

字节流-》字符流-》字符缓存流 即 将字节流转换为字符流之后在用高级流包装。

所以我的思路是避免在逻辑里出现太多的IO流关闭,和异常捕获,专心处理读取逻辑即可,结合以下两种技术:

try(){}【自动关闭流,1.7支持】

lambda特性来实现【行为参数化,1.8】

a506bf431f4841705af3fc8653d7c3f7.png

执一个行为,任何BufferReader -> String的Lambda表达式都可以作为参数传入。只要符合peocess方法的签名即可。

391f68bb3ae4b3d9f2a0bc0cb5fc4601.png

执行

eca75ce5329aaa6f46962774c24e7323.png

d42d4ae08ebf4696f19604d439fb47fc.png

干货分享:扫码关注下面的公众号获取面试资料+项目实战资料(电商/聚合支付)

435c11f3266127ed2571c117e7715395.gif

点击阅读原文,获免费JVM+MySQL+设计模式+分布式+微服务完整面试资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值