【问题标题】:How to proceed processing items when error is occurring?发生错误时如何处理项目?
【发布时间】:2019-04-24 15:18:20
【问题描述】:

考虑以下代码:

    Collection<String> foos = Arrays.asList("1", "2", "3", "X", "5", "6", "7", "8", "9", "10");

    Flowable<Integer> integerFlowable = Flowable.fromIterable(foos).map(s -> Integer.parseInt(s)).onErrorReturnItem(-1);

    PublishProcessor<Integer> processor = PublishProcessor.create();
    processor.map(i -> 2 * i).subscribe(i -> System.out.println(i), e -> System.out.println("error!"));
    integerFlowable.subscribe(processor);

到达“X”时处理结束。

如何指示 RxJava 继续处理其余项目?

【问题讨论】:

    标签: java rx-java rx-java2


    【解决方案1】:

    如果尝试用给定值(例如 -1)替换所有“无效”输入,您可以提供不同的映射器函数。

    Flowable<Integer> integerFlowable = Flowable.fromIterable(foos)
        .map(s -> {
            try {
                return Integer.parseInt(s);
            } catch (NumberFormatException e) {
                return -1;
            }
        });
    

    您还可以在创建 Flowable 之前删除所有“无效”输入。

    Collection<String> foos = Arrays.asList("1", "2", "3", "X", "5", "6", "7", "8", "9", "10");
    Collection<String> numbers = foos.stream().filter(s -> {
        try {
            Integer.parseInt(s);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }).collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      通常,调用层次结构中的上层方法应该以有用的方式处理异常(不仅仅是捕获)。通常这意味着向用户显示有用的错误消息。

      对于您的用例,检查字符串是否为数字就足够了:

      if (s.matches("-?\\d+")) {
          Integer.parseInt(s)
      }
      

      这是一个基本示例,可能不会涵盖您的所有用例(例如前导零或溢出之类的东西)。

      【讨论】:

      • 好的,我想如果发生异常,不启用继续处理是有道理的。
      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      相关资源
      最近更新 更多