4 回答
TA贡献1868条经验 获得超4个赞
以下是一些可能的解决方案:
将方法签名更改为
public void writeToFile()
. 不要退回Path
. (但这可能对你不起作用:你可能需要.Path
)return null;
在方法末尾添加。这样做的缺点是调用者需要处理null
返回的情况......否则当他们尝试使用不存在的 时它将获得 NPEPath
。这相当于您的“丑陋”解决方案。从风格的角度来看,哪个更好是值得商榷的。(一个教条的“结构化编程”人会说你的方式更好!)
更改签名以返回为
Optional<Path>
. 这是比返回显式更好的选择null
。如果你正确地实现它,调用者实际上被迫处理“缺席”的情况。删除try catch并将方法的签名更改为
public Path writeToFile() throws IOException
. 调用者必须处理已检查的异常,但这可能是件好事!
我应该指出您的代码没有正确处理资源。您应该对资源使用 try以确保由创建的流FileWriter
始终关闭。否则存在泄漏文件描述符的风险,最终可能导致意外的 I/O 错误。
TA贡献1946条经验 获得超4个赞
如果您不想返回,null我会更喜欢使用Optionaljava 8
public Optional<Path> writeToFile() {
try {
Path tempFilePath = Files.createTempFile(Paths.get(""), "sorting_test_", ".txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(tempFilePath.toFile()));
for (List<Integer> arr : arrays) {
// Convert array ints to strings, join it to single string and write
bw.write(arr.stream()
.map(String::valueOf)
.collect(Collectors.joining(" ")));
bw.newLine();
}
bw.close();
return Optional.of(tempFilePath);
} catch (IOException e) {
e.printStackTrace();
}
return Optional.empty()
}
所以在调用者方法中你可以使用
public void ifPresent(消费者消费者)
或者
公共布尔 isPresent()
TA贡献1827条经验 获得超8个赞
另一种解决方案不是吃IOException(反模式),而是将其转换为适当的子类RuntimeException并从 catch 块中抛出。
此外,在您的示例中,您正在泄漏文件处理程序,而不是关闭FileWriter异常。
public Path writeToFile() {
final Path tempFilePath;
try {
tempFilePath = Files.createTempFile(Paths.get(""), "sorting_test_", ".txt");
} catch (IOException e ) {
throw new MyRuntimeException(
"Cannot create sorting_test temp file",
e
);
}
try (final FileWriter fw = new FileWriter(tempFilePath.toFile())) {
try(final BufferedWriter bw = new BufferedWriter(fw)) {
for (List<Integer> arr : arrays) {
// Convert array ints to strings, join it to single string and write
bw.write(arr.stream()
.map(String::valueOf)
.collect(Collectors.joining(" ")));
bw.newLine();
}
}
return tempFilePath;
} catch (IOException e) {
throw new MyRuntimeException(
"Cannot write to " + tempFilePath,
e
);
}
}
添加回答
举报