[JAVA] 람다식 내부에서의 에러처리

유알·2023년 1월 6일
0

[JAVA]

목록 보기
6/13
import java.io.*;
import java.util.Arrays;


public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int repeatNum = Integer.parseInt(br.readLine());
        int sum;
        for (int i = 1;i <= repeatNum; i++){
            bw.write("Case #" + i +": ");
            Arrays.stream(br.readLine().split(" "))
            .mapToInt(Integer::parseInt)
            .reduce( (a,b) -> {
                bw.write(a + " + "+ b); //이 라인에서 IOException 처리 필요하다고 뜸
                return a+b;
            });
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

이 코드는 완성되지 않았다.
하지만 보아야 할 곳은 바로 저 stream 내부의 .reduce() 부분을 보자.
ide는 나에게 저곳에서 IOException handling이 없다고 알려준다.

어라? 위에 throws IOException을 해놓았는데?
하고 다시 생각해보니 람다식은 Functional Interface 이다.
즉 익명 클래스랑 같다.

@FunctionalInterface
public interface IntBinaryOperator {
    int applyAsInt(int left, int right);
}

여기서는 이 Functional Interface를 익명 클래스로 구현한 것이라고 생각하면 된다.
보다싶이 이 클래스에는 throws IOException를 처리할 수 있는게 없다.
즉 람다식 안에서의 checked exception 처리는 별도로 해주어야 한다. (불편하다...)

해결방법

즉 안에서 try-catch 문을 넣어주거나,
throws 가 달린 functional interface 를 만들어서 그걸 사용해도 된다.

둘다 번잡스럽다.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글