处理流java 8中的异常

时间:2017-11-15 23:36:33

标签: java list exception java-8 java-stream

我有一个字符串:

"1, 2, 3 , -4"

它被“,”拆分。 我有一个函数将数字转换为枚举类型,工作正常。我想使用java 8将此字符串转换为枚举对象列表。

Pattern pattern = Pattern.compile(", ");
List<f> fList = pattern.splitAsStream(str)
  .map(s -> {
    try {
      return this.getEnumObject(Integer.valueOf(s), f.class);
    }
    catch (NoEleException e) {
      e.printStackTrace();
    }
  })
  .collect(Collectors.toList());

这给了我一个错误:

missing return type.

我该如何解决?

4 个答案:

答案 0 :(得分:6)

目前,如果发生异常,则不会返回结果,因此编译错误。您需要在catch阻止后返回一个值。

答案 1 :(得分:0)

您可以像MissingElement一样创建Null对象,将其返回catch并在map之后将其过滤掉。

答案 2 :(得分:0)

基本上是管理这个的方法:

  1. 捕获异常返回一些值或封装Optionals中的值并相应地过滤
  2. 抛出一个链接原始的
  3. 的RuntimeException

    在第一种情况下,我们使用Optional在出错时将某些内容放入流中,然后在流中进一步管理这些空值:

    pattern.splitAsStream(str)
    .map(s -> {
      try {
        return Optional.of(this.getEnumObject(Integer.valueOf(s), f.class));
      }
      catch (NoEleException e) {
        e.printStackTrace();
        return Optional.empty();
      }
     })
    .filter(Optional::isPresent) // remove empty optionals
    .map(Optional::get) // unwrap them
    .collect(Collectors.toList());
    

    在第二种情况下,流停止,然后您可以尝试捕获RuntimeException并取消链接原始流:

    pattern.splitAsStream(str)
    .map(s -> {
      try {
        return Optional.of(this.getEnumObject(Integer.valueOf(s), f.class));
      }
      catch (NoEleException e) {
        e.printStackTrace();
        throw new RuntimeException(e); // stop the stream
      }
     })
    .collect(Collectors.toList());
    

答案 3 :(得分:0)

如果您确定这不会发生,您可以在收集之前在捕获和过滤器中返回空值:

Pattern pattern = Pattern.compile(", ");
List<f> fList = pattern.splitAsStream(str)
  .map(s -> {
    try {
      return this.getEnumObject(Integer.valueOf(s), f.class);
    }
    catch (Exception e) {
      return null;
    }
  })
  .filter(Objects::nonNull)
  .collect(Collectors.toList());