从try-catch块返回值的正确方法是什么?

时间:2019-04-30 00:30:41

标签: java exception

由于缺少返回值而无法运行的示例:

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;
}

但是看起来很丑。有没有更自然的方法来解决此任务?

5 个答案:

答案 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.