Java: 未处理的异常

Java: unhandled exception

我想处理一个异常,但 Eclipse 编辑器给了我一些我不理解的提示。这是方法的代码:

    public Collection<String> listOfFriends(String codePerson)
            throws NoSuchCodeException {

        Collection<String> s = new LinkedList<>();
        try {
            people.get(codePerson).getFriendsCodes().forEach( code -> s.add(getPerson(code)));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return s;

getPerson 在哪里:

    public String getPerson(String code) throws NoSuchCodeException {
        if(!people.containsKey(code)){
            throw new NoSuchCodeException();
        }
        return people.get(code).getCode() + " " + people.get(code).getName() + " " + people.get(code).getSurname();

例外情况是:

public class NoSuchCodeException extends Exception {
    NoSuchCodeException(){}
    NoSuchCodeException(String msg){
        super(msg);
    }

}

Eclipse returns listOfFriends 方法中的两个错误,一个在调用 getPerson() 的地方,说 "Unhandled exception type NoSuchCodeException",另一个在 catch 行,说 "Unreacheable catch block for NoSuchCodeException. This exception is never thrown from the try statement body".

PS:我在 listOfFriends 方法中添加了 try 和 catch 只是为了尝试解决问题,因为据我所知,鉴于该方法在其声明中具有 "throws NoSuchCodeException",这不应该是强制性的,对吧?

提前致谢。

问题是由 lambda 函数引起的。 forEach 需要的函数接口没有声明任何类型的检查异常:看看 java.util.function.Consumer。那是第一个问题发生的地方,第二个问题只是第一个问题的结果。

您应该 NoSuchCodeException 扩展 RuntimeException 或向您的 lambda 添加 try catch 块。我建议你坚持第一个解决方案,除非 NoSuchCodeException 是在正常情况下可能发生的事情。

也看看这个问题:Java: checked vs unchecked exception explanation.

您将不得不在 forEach 块内捕获该异常。由于未声明 [​​=11=] 处理异常,因此您必须一路帮助它。

另一种方法是将您的异常更改为未经检查的异常,但这可能不适用于您的特定用例。

try {
    people.get(codePerson).getFriendsCodes().forEach(code -> {
        try {
            s.add(getPerson(code));
        } catch (NoSuchCodeException e) {
            e.printStackTrace();
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}