为什么以下代码段
private void getEvents() throws VersionNotFoundException{
gameRepository.findAll().forEach(game->{
HttpHeaders headers = new HttpHeaders();
String appVersion = getClass().getPackage().getImplementationVersion();
if (appVersion==null) {
throw new VersionNotFoundException();
}
headers.set("X-TBA-App-Id","4205:"+this.getClass().getPackage().getImplementationVersion());
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
restTemplate.exchange(getEventsForYearString, HttpMethod.GET,requestEntity , Event.class, game.getYear());
});
}
private class VersionNotFoundException extends Exception {
}
某个类中的导致行throw new VersionNotFoundException();
引发VersionNotFoundException
must be caught or declared to be thrown
的编译错误?很明显,它被宣布抛出。
答案 0 :(得分:3)
传递给gameRepository.findAll().forEach()
的lambda函数没有throws
。这就是错误所说的。
答案 1 :(得分:1)
您覆盖的lambda方法在其签名中没有VersionNotFoundException
,因此被覆盖的方法也可以(包括您的lambda)。由于#forEach
接受不允许检查异常的消费者,因此您必须始终捕获该lambda中的异常。
至于确定是否需要抛出异常,我会完全在#forEach
之外执行此操作:
private void getEvents() throws VersionNotFoundException {
String appVersion = getClass().getPackage().getImplementationVersion();
if (appVersion == null) {
throw new VersionNotFoundException();
}
gameRepository.findAll().forEach(game-> {
HttpHeaders headers = new HttpHeaders();
headers.set("X-TBA-App-Id", "4205:"+ appVersion);
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
restTemplate.exchange(getEventsForYearString, HttpMethod.GET, requestEntity, Event.class, game.getYear());
});
}
答案 2 :(得分:0)
在lambda表达式中不能抛出Checked Exceptions。这是在一个lambda里面的事实让我不知所措。