由于缺少返回值而无法运行的示例:
public 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 tempFilePath;
} catch (IOException e) {
e.printStackTrace();
}
}
我知道我可以这样做:
public Path writeToFile() {
Path tempFilePath = null;
//try-catch{...}
return tempFilePath;
}
但是看起来很丑。有没有更自然的方法来解决此任务?
答案 0 :(得分:1)
如果您不想返回null
,我会更喜欢从Java 8使用Optional
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()
}
因此,在调用方方法中,您可以使用
ifPresent(消费者)无效。
或
公共布尔isPresent()
答案 1 :(得分:1)
以下是一些可能的解决方案:
将方法签名更改为public void writeToFile()
。不要返回Path
。 (但这可能对您不起作用:您可能需要 Path
。)
在方法末尾添加return null;
。这样做的缺点是,调用者需要处理返回null
的情况……否则,当他们尝试使用不存在的Path
时,它将得到NPE。
这等效于您的“丑陋”解决方案。这是值得商which的,从风格角度来看这更好。 (教条主义的“结构化编程”人会说你的方法更好!)
更改签名以返回Optional<Path>
。这比返回显式null
更好。如果正确实现,调用者将被迫处理“缺席”案件。
删除 try catch 并将方法的签名更改为public Path writeToFile() throws IOException
。调用者必须处理已检查的异常,但这可能是一件好事!
我应该指出您的代码没有正确处理资源。您应该使用带有资源的 try 来确保FileWriter
创建的流总是 关闭。否则,就有泄漏文件描述符的风险,最终可能导致意外的I / O错误。
答案 2 :(得分:1)
我不知道您为什么要寻找一个更“自然”的解决方案,但是您可以return null
放在您的catch块中。
答案 3 :(得分:1)
另一种解决方案,而不是使用IOException
(反模式),将其转换为RuntimeException
的适当子类,然后从catch块中抛出。
另外,在您的示例中,您正在通过不关闭例外情况{@ {1}}来泄漏文件处理程序。
FileWriter
答案 4 :(得分:1)
最合适的方法是将return语句保留在try块中。
如果我们将return语句保留在最后或catch之后,则可能是吞没了异常。
This is an old link that seems to be related. See if this helps.