为什么 Java 流即使使用 try-catch 块也无法处理异常?

问题描述 投票:0回答:1

我有以下一段带有 Java 流的代码

你可以看到我在第四行有一个错误。基本上,错误显示“未处理的异常:AddressException”。但你可以看到我正在 catch 块中捕获它。但这仍然不起作用。尽管如此,如果我在 map 方法中使用 try catch 块,它的工作原理如下所示:

public List<InternetAddress> getListOfInternetEmailAddresses(List<String> toEmails){
     List<InternetAddress> internetAddresses = new ArrayList<>();
          internetAddresses = toEmails.stream().map(a->{
              InternetAddress ia = null;
              try{
                 ia = new InternetAddress(a);
              } catch (AddressException e) {
                  
              }
              return ia;
          }).collect(Collectors.toList());
      return internetAddresses;
}

有谁知道为什么会出现这种行为,如果知道请对此提供一些见解。还有一个问题,匿名内部类也会有同样的行为吗?

java exception java-8 java-stream try-catch
1个回答
4
投票

显示错误是因为您提供了具有不同签名的方法(附加 thows 子句)。您必须提供与 java.util.function.Function#apply 签名兼容的实现

R apply(T var1);

有几种方法可以解决您的问题:

  • 带有 try-catch 的匿名函数
    public List<InternetAddress> getListOfInternetEmailAddresses(List<String> toEmails) {
        return toEmails.stream().map(new Function<String, InternetAddress>() {
            @Override
            public InternetAddress apply(String email) {
                try {
                    return new InternetAddress(email);
                } catch (AddressException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }).collect(Collectors.toList());
    }
  • 在 lambda 中尝试捕获
    public List<InternetAddress> getListOfInternetEmailAddresses(List<String> toEmails) {
        return toEmails.stream().map(email -> {
            try {
                return new InternetAddress(email);
            } catch (AddressException e) {
                e.printStackTrace();
            }
            return null;
        }).collect(Collectors.toList());
    }
  • 提取处理方法
    public List<InternetAddress> getListOfInternetEmailAddresses(List<String> toEmails) {
        return toEmails.stream().map(this::createInternetAddress).collect(Collectors.toList());
    }

    private InternetAddress createInternetAddress(String email) {
        try {
            return  new InternetAddress(email);
        } catch (AddressException e) {
            e.printStackTrace();
        }
        return null;
    }
  • 广义提取处理方法
@FunctionalInterface
public interface FunctionThrowing <T, R, E extends Exception> {
    R apply(T var1) throws E;

    static <T, R, E extends Exception> Function<T, R> handled(FunctionThrowing<T, R, E> ft) {
        return result -> {
            try {
                return ft.apply(result);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        };
    }
}
    public List<InternetAddress> getListOfInternetEmailAddresses(List<String> toEmails) {
        List<InternetAddress> internetAddresses = new ArrayList<>();
        internetAddresses = toEmails.stream().map(FunctionThrowing.handled(InternetAddress::new)).collect(Collectors.toList());
        return internetAddresses;
    }
© www.soinside.com 2019 - 2024. All rights reserved.