Java Lambda表达式的异常处理
时间:2020-01-09 10:35:14 来源:igfitidea点击:
在这篇文章中,我们将看到Java中的lambda表达式的异常处理。 Lambda表达式可以引发异常,但应与功能接口的abstract方法的throws子句中指定的异常兼容。
如果lambda表达式主体引发了检查的异常,则函数接口方法的throws子句必须声明相同的异常类型或者其超类型。
Lambda表达式中的已检查异常
在示例抽象方法中,计算功能接口MyFunctionalInterface的方法没有throws子句,但是lambda主体抛出异常。在这种情况下,将生成编译器错误消息"未处理的异常类型异常"。
如果在功能接口方法中指定相同的异常,则可以解决错误,但在调用该方法时确实需要处理该错误。
@FunctionalInterface interface MyFunctionalInterface{ int calculate(int i, int j) throws Exception; } public class LambdaException { public static void main(String[] args) { MyFunctionalInterface ref = (x, y) -> { int num = x * y; throw new Exception(); //return num; }; try { System.out.println("Result is " + ref.calculate(8, 5)); }catch(Exception e) { System.out.println("Exception while calculating " + e.getMessage()); } } }
Lambda表达式中未经检查的异常
在未检查的异常的情况下,不存在应在功能接口的抽象方法中指定的限制。
在示例示例中,功能接口MyFunctionalInterface的calculate方法没有throws子句,但是lambda主体抛出了运行时异常。
@FunctionalInterface interface MyFunctionalInterface{ int calculate(int i, int j); } public class LambdaException { public static void main(String[] args){ MyFunctionalInterface ref = (x, y) -> { try { int num = x/y; return num; }catch(ArithmeticException e) { System.out.println("Exception while calculating- " + e.getMessage()); throw new RuntimeException(e); } }; System.out.println("Result is " + ref.calculate(8, 0)); } }
包装lambda以处理异常
许多人喜欢保持lambda表达式代码简洁明了,没有try catch块。
在这种情况下,我们可以创建包装lambda的包装器类,然后调用它。
@FunctionalInterface interface MyFunctionalInterface{ int calculate(int i, int j); } public class LambdaException { // Lambda wrapper static MyFunctionalInterface lambdaWrapper(MyFunctionalInterface ref) { return (x, y) -> { try { ref.calculate(x, y); }catch(ArithmeticException e) { System.out.println("Exception while calculating- " + e.getMessage()); } return -1; }; } public static void main(String[] args){ // calling lambda wrapp MyFunctionalInterface ref = lambdaWrapper((x,y)->x/y); System.out.println("Result is " + ref.calculate(8, 0)); } }
输出:
Exception while calculating- / by zero Result is -1