在Java 8中如何处理流异常

5

I have a string:

"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.

我该如何修复它?


如果你要抑制异常,你需要返回一些值。这个值由你决定。 - shmosel
如果一些数字无法解析为枚举对象,您希望将什么内容添加到列表中? - Misha
@misha 这种情况永远不会发生...但如果真的发生了,只需要一个空对象就可以了。 - user3369592
1
如果您确信永远不会发生异常,您可以在catch块中抛出new RuntimeException(e) - Misha
4个回答

6

目前,如果发生异常,则不会返回任何结果,因此会出现编译错误。您需要在catch块之后返回一个值。


那样的话,他想要的值会是什么呢? - StvnBrkdll

5
基本上有两种管理方法:
  1. 捕获异常并返回一些值或将值封装在Optionals中,然后进行过滤
  2. 抛出一个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());

0

您可以创建类似于MissingElement的Null Object,在catch中返回它,然后在map之后将其过滤掉。


0
如果您确定这种情况不会发生,您可以在catch中返回null,并在收集之前过滤非null值:
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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接