【发布时间】:2015-04-24 04:34:37
【问题描述】:
我正在使用 Java 8 中引入的 Stream API 为列表中的每个字符串运行一个方法。
public boolean initFile() throws IOException
{
if (this.outFile.exists()) {
this.outFile.delete();
}
return this.outFile.createNewFile();
}
public void writeStringToFile(String str, boolean addNewLine) throws IOException
{
if (this.mode != FileMode.READ) {
if (this.initFile()) {
FileWriter fileWriter;
if (this.mode == FileMode.APPEND)
fileWriter = new FileWriter(outFile.getAbsolutePath(), true);
else
fileWriter = new FileWriter(outFile.getAbsolutePath());
fileWriter.write(str);
if (addNewLine)
fileWriter.write("\n");
fileWriter.close();
} else {
throw new IOException("IO Error: The file could not be initialized.");
}
} else {
throw new IOException("Cannot write to a file with the mode FileMode.READ");
}
}
public void writeListToFile(List<String> strings, boolean addNewLine) throws IOException
{
strings.stream().forEach(s -> this.writeStringToFile(s, addNewLine)); // Unhandled IOException from writeStringToFile
}
如您所见,方法签名声明抛出所有 IOException,流中的 writeToString 方法有可能抛出 IOException。但是,Java 编译器给了我一个错误,指出流线上有一个未处理的 IOException。
为什么流中的异常不会像方法中的任何其他异常一样被抛出?有什么方法可以在不在 forEach lambda 表达式中添加 try-catch 语句的情况下解决这个问题?
【问题讨论】:
-
如果抛出 IOException,你希望发生什么?请注意,这与 lambdas 和常规异常规则无关。
Stream#forEach和Consumer#accept不声明抛出此异常。 -
你能用你的 initFile 方法声明更新你的问题吗
-
我已经添加了 initFile 方法。请注意,所有 IOExceptions 都是有意抛出的。
-
您的代码不合逻辑。如果文件存在,则将其删除,因此支持附加模式毫无意义,因为您总是在
initFile()之后附加到新文件。另一方面,由于您实际上总是创建一个新文件,因此您根本不需要initFile()方法,new FileWriter(…)会做到这一点。换句话说,当您的模式不是APPEND时,您可能会删除一个文件、创建一个新文件、再次隐式删除它并创建一个新文件……
标签: java file exception lambda java-stream