在学习了前面的内容,你可能有一个疑问,那就是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来处理异常。