더북(TheBook)

마지막으로, 람다 표현식이 함수형 인터페이스의 인스턴스로 변환될 때 검사 예외checked exception가 문제가 된다는 점을 유의하기 바란다. 람다 표현식의 몸체에서 검사 예외를 던질 수 있는 경우, 해당 예외가 대상 인터페이스의 추상 메서드에 선언되어 있어야 한다. 예를 들어, 다음은 오류다.


Runnable sleeper =

() -> { System.out.println("Zzz"); Thread.sleep(1000); };

// 오류: Thread.sleep 은 검사 예외인 InterruptedException을 던질 수 있다.


 

Runnable.run 메서드는 예외를 던질 수 없기 때문에, 위의 대입은 잘못된 것이다. 이 오류를 바로잡는 데는 두 가지 선택이 있다. 먼저, 람다 표현식의 몸체에서 예외를 잡을 수 있다. 그렇지 않으면 해당 예외를 던질 수 있는 단일 추상 메서드를 갖춘 인터페이스에 람다를 대입한다. 예를 들어, Callable 인터페이스의 call 메서드는 어떤 예외든 던질 수 있다. 따라서 (return null 문장을 추가한다면) 위의 람다 표현식을 Callable<Void>에 대입할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.