java" throws"条款不起作用

时间:2017-03-21 05:31:28

标签: java exception

为什么以下代码段

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的编译错误?很明显,它被宣布抛出。

3 个答案:

答案 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里面的事实让我不知所措。