在java 8流foreach中抛出异常

时间:2016-12-16 03:54:11

标签: error-handling java-8 java-stream

我正在使用java 8流,我不能在流的foreach中抛出异常。

 stream.forEach(m -> {
        try {

            if (isInitial) {
                isInitial = false;
                String outputName = new SimpleDateFormat(Constants.HMDBConstants.HMDB_SDF_FILE_NAME).format(new Date());
                if (location.endsWith(Constants.LOCATION_SEPARATOR)) {
                    savedPath = location + outputName;
                } else {
                    savedPath = location + Constants.LOCATION_SEPARATOR + outputName;
                }
                File output = new File(savedPath);
                FileWriter fileWriter = null;
                fileWriter = new FileWriter(output);
                writer = new SDFWriter(fileWriter);
            }

            writer.write(m);

        } catch (IOException e) {
            throw new ChemIDException(e.getMessage(),e);
        }

    });

这是我的异常类

public class ChemIDException extends Exception {
public ChemIDException(String message, Exception e) {
    super(message, e);
}

}

我正在使用记录器来记录上层错误。所以我想将异常抛到顶部。感谢

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试扩展RuntimeException。为foreach提供的方法创建的方法不具有throwable类型,因此您需要一些可运行时抛出的东西。

警告:这可能不是一个非常好的想法

但它可能会奏效。

答案 1 :(得分:0)

为什么使用fork(),一种用于处理每个元素的方法,当你想要做的只是处理第一个元素时?而不是意识到forEach是错误的工作方法(或者流API中的方法多于forEach),而是用forEach标志来解决这个问题。

考虑一下:

isInitial

没有异常处理问题。此示例假定Stream的元素类型为Optional<String> o = stream.findFirst(); if(o.isPresent()) try { String outputName = new SimpleDateFormat(Constants.HMDBConstants.HMDB_SDF_FILE_NAME) .format(new Date()); if (location.endsWith(Constants.LOCATION_SEPARATOR)) { savedPath = location + outputName; } else { savedPath = location + Constants.LOCATION_SEPARATOR + outputName; } File output = new File(savedPath); FileWriter fileWriter = null; fileWriter = new FileWriter(output); writer = new SDFWriter(fileWriter); writer.write(o.get()); } catch (IOException e) { throw new ChemIDException(e.getMessage(),e); } 。否则,您必须调整String类型。

但是,如果您的Optional<String>标记在流处理期间应该多次更改,则肯定是使用错误的工具进行处理。在使用Streams之前,您应该已阅读并理解Stream API文档的“Stateless behaviors” and “Side-effects” sections以及“Non-interference” section。只是将循环转换为Stream上的isInitial调用不会改善代码。