Java Lambda从入门到精通四 异常处理

在学习了前面的内容,你可能有一个疑问,那就是lambda发生了异常如何处理。

我们常说的异常分为两种,一种是受检异常,一种是非受检异常。

受检异常也就是代码编写阶段进行的异常声明和处理,我们要说的lambda的异常处理就是受检异常。

Java8并没有给lambda设置专门的异常处理语法,所以lambda的异常还是以传统的异常处理方式来处理的。

分为两种异常处理方式。

一种是在lambda对应的函数式接口的抽象方法上声明,例如:

/**
 * @Auther: www.itzhimei.com
 * @Description:
 */
@FunctionalInterface
public interface AppleFormatter {

    String accept(Apple apple) throws ClassCastException;
}

我们在方法最后主动抛出了一个类型转换异常:ClassCastException,测试代码还是以前面章节的苹果例子,如下:

方法:

public static void printApple(List<Apple> apples, AppleFormatter af) {
        for(Apple a : apples) {
            System.out.println(af.accept(a));
        }
    }

调用:

printApple(apples,a -> {throw new ClassCastException(a.getColor());});

输出结果:

Exception in thread "main" java.lang.ClassCastException: 红
	at com.itzhimei.study.lambda.unit3.Lambda3.lambda$main$2(Lambda3.java:29)
	at com.itzhimei.study.lambda.unit3.Lambda3.printApple(Lambda3.java:45)
	at com.itzhimei.study.lambda.unit3.Lambda3.main(Lambda3.java:29)

第二种方式就是在lambda中通过try-catch来处理异常。

printApple(apples,a -> {
            try {
                throw new ClassCastException(a.getColor());
                //return a.getColor().equals("红") ? "红苹果" : "绿苹果";
            } catch (ClassCastException e) {
                e.printStackTrace();
            }
            return "";
        });

输出结果:

java.lang.ClassCastException: 红
	at com.itzhimei.study.lambda.unit3.Lambda3.lambda$main$3(Lambda3.java:35)
	at com.itzhimei.study.lambda.unit3.Lambda3.printApple(Lambda3.java:57)
	at com.itzhimei.study.lambda.unit3.Lambda3.main(Lambda3.java:33)
java.lang.ClassCastException: 绿
	at com.itzhimei.study.lambda.unit3.Lambda3.lambda$main$3(Lambda3.java:35)
	at com.itzhimei.study.lambda.unit3.Lambda3.printApple(Lambda3.java:57)
	at com.itzhimei.study.lambda.unit3.Lambda3.main(Lambda3.java:33)
java.lang.ClassCastException: 红
	at com.itzhimei.study.lambda.unit3.Lambda3.lambda$main$3(Lambda3.java:35)
	at com.itzhimei.study.lambda.unit3.Lambda3.printApple(Lambda3.java:57)
	at com.itzhimei.study.lambda.unit3.Lambda3.main(Lambda3.java:33)

我们通过上面两种lambda的异常处理可以看出,lambda的异常处理和java传统的代码异常处理没有差异。

其实也可以直接在lambda的代码执行位置,使用try-catch来处理异常。