[Java] Lambda - Exception Handling

반응형

이번 글에서는 lambda의 exception handling 방법에 대해 알아보도록 하겠습니다.

1. Exception Handling

lambda에서 exception handling을 구현 하기위해선 어떻게 해야할까요? 😅

예를 들어 입력받은 배열의 elements를 key로 나눈 값을 출력하는 예제가 있다고 가정해보겠습니다.

public class ExceptionHandling {
    public static void main(String[] args) {
        int[] someNumbers = {1, 2, 3, 4};
        int key = 2;

        // print 
        process(someNumbers, key, (k, v) -> System.out.println(k / v));
    }

    private static void process(int[] someNumbers, int key, BiConsumer<Integer, Integer> consumer) {
        for (int i : someNumbers) {
            consumer.accept(i, key);
        }
    }
}

위의 경우, 만약 key가 0이라면 어떻게 될까요..?

당연히 위와 같이 Exception이 발생하게 됩니다.

1-1) inline try catch

그렇다면 예외 처리를 위해 다음과 같이 lambda 식을 변경해보겠습니다.

process(someNumbers, key, (k, v) -> {
    try{
        System.out.println(k / v);
    }catch (ArithmeticException e){
        System.out.println("Exception Handling..");
    }
});

음.. 😂 뭔가 찝찝하네요..

우리는 이전 글에서 lambda 식을 사용하는 이유 중 하나로, 짧고 간결한 코드를 예로 들었습니다. 하지만, 위의 경우는 전혀 코드가 간결하지 않습니다..

이를 해결할 방법은 'wrapper lambda' 메서드를 사용하는 것 입니다.

1-2) wrapper lambda

wrapper lambda 함수를 사용하면 기존의 짧고 간결한 lambda 식을 유지하며 exception handling을 처리할 수 있습니다. 😎

wrapper lambda 함수란, 전달받은 lambda 식을 trigger하는 기능만 수행하는 method라고 해석 할 수 있습니다.

public class ExceptionHandling {
    public static void main(String[] args) {
        int[] someNumbers = {1, 2, 3, 4};
        int key = 0;

        process(someNumbers, key, wrapperLambda((v, k) -> System.out.println(v / k)));
    }

    private static void process(int[] someNumbers, int key, BiConsumer<Integer, Integer> consumer) {
        for (int i : someNumbers) {
            consumer.accept(i, key);
        }
    }

    private static BiConsumer<Integer, Integer> wrapperLambda(BiConsumer<Integer, Integer> consumer) {
        return (v, k) -> {
            try {
                consumer.accept(v, k);
            } catch (ArithmeticException e) {
                System.out.println("Exception Handling..");
            }
        };
    }
}

wrapperLambda 함수의 역할은 다음과 같습니다.

• 전달받은 lambda 식을 try catch 문으로 감싸 exception handling을 처리합니다.

• 전달받은 lambda 의 accept 메서드를 trigger 합니다.

• 전달받은 input lambda와 동일한 type을 return 합니다.

기존의 lambda를 try catch 포장지로 감싸서 method에 전달하는 역할을 수행한다고 이해하면 될 것 같습니다.

실행해보면 위와 같이 정상적으로 Exception Handling이 동작하는 것을 확인할 수 있습니다. 👏👏👏


추천서적

 

이것이 자바다:신용권의 Java 프로그래밍 정복

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Java' 카테고리의 다른 글

[Java] Lambda - This Reference  (0) 2020.08.16
[Java] Lambda - Closure  (0) 2020.08.16
[Java] Lambda - Functional Interface  (0) 2020.08.16
[Java] Lambda - Using Lambda  (0) 2020.08.16
[Java] Lambda - Understanding Lambda  (0) 2020.08.16

댓글

Designed by JB FACTORY