在项目中, 我们会遇到异常处理, 对于运行时异常, 需要我们自己判断处理. 对于受检异常, 需要我们主动处理.
但是繁琐的 try{}caht 嵌套在代码里, 看着很不舒服, 这里我们不讨论性能, 就代码来讲, 来看看如何将他隐藏起来. 原理是不变的. 变得是写法. 下面我们来看如何优雅的处理异常块.
在这之前. 你需要知道以下几个概念:
行为参数化:
是 java8 提出的, 函数式编程的一种思想, 通过把代码包装为参数传递行为, 即把代码逻辑包装为一个参数, 传到方法里.
Lambda 表达式:
java8 提出: Lambda 表达式理解为简洁的表示可传递的匿名函数的一种方式, 它没有名称, 但它有函数体, 参数列表, 返回类型. 可以抛出一个异常类型. 包装代码逻辑为参数即使用 Lambda 表达式.
函数式接口:
本质上是只有一个抽象方法的普通接口, 可以被隐式的转换为 Lambda 表达式, 需要用注解定义 (@FunctionalInterface). 默认方法和静态方法可以不属于抽象方法, 可以在函数式接口中定义.
如果函数式接口中额外定义多个抽象方法, 那么这些抽象方法签名必须和 Object 的 public 方法一样, 接口最终有确定的类实现, 而类的最终父类是 Object. 因此函数式接口可以定义 Object 的 public 方法.
这句代码想来小伙伴都不陌生. 这是一个受检异常, 需要抛出一个 ClassNotFoundException.
正常的写法:
嗯, 我们来看具体的实现: 很简单, 我们要做的, 即把 `Class<?> clazz = Class.forName("类名");` 当做一种行为去处理, 接受一个 String , 得到一个 Class, 所以我们要定义一个函数接口, 描述这种行为.
这里, 因为我们的行为需要抛出异常. 所以在接口里也抛出异常.
然后, 我们需要定义一个方法, 将我们的行为作为参数传进去, 同时, 捕获一下我们的异常.
然后, 我们可以调用我们的方法 classFind 方法,
当然. 其实这种思想并不简单的可以做捕获异常的处理,
我们来看一个 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]
执一个行为, 任何 BufferReader -> String 的 Lambda 表达式都可以作为参数传入. 只要符合 peocess 方法的签名即可.
执行
来源: https://www.cnblogs.com/liruilong/p/13403963.html