我正在使用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);
}
}
我正在使用记录器来记录上层错误。所以我想将异常抛到顶部。感谢
答案 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
调用不会改善代码。