如何正确地重构Java方法以进行正确的错误处理

时间:2015-07-21 14:31:21

标签: java error-handling exception-handling

我有一个现有的Java方法,我不确定如何正确地重构。我希望始终调用finally子句,但是有些调用者需要知道什么时候抛出异常,这样他们就可以做一些额外的内务管理。

该方法是否保持原样,或者我是否删除了所有catch条款并将其丢弃?还有另一种方法可以解决这个问题吗?

更新:抱歉,忘记提及,我必须使用Java版本6

我认为最终条款在某种程度上是非正统的,没有附带但不确定正确的方法。

public static final synchronized String getContents(File file) {
    StringBuilder builder = null;       
    Reader reader = null;
    try {
        builder = new StringBuilder();
        reader = new InputStreamReader(new FileInputStream(file));
        int data;
        while((data = reader.read()) != -1) {
            builder.append((char)data);
        }
    }
    catch (IOException e) {
        throw new RuntimeException("IO Exception: " + e.getMessage(), e);           
    }
    finally {
        try {
            reader.close();
        } 
        catch (IOException e) {
            throw new RuntimeException("IO Exception: " + e.getMessage(), e);           
        }           
    }
    return builder.toString();
}

4 个答案:

答案 0 :(得分:2)

您不需要 catch阻止使用try ... finally。嵌套异常更难阅读,因此我将其排除在外。

答案 1 :(得分:1)

从Java 7开始,您可以使用https://github.com/spring-projects/spring-data-neo4j/blob/4.0.x/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/MoviesIntegrationTest.java

public static final synchronized String getContents(final File file) {
    StringBuilder builder = null;
    try (Reader reader = new InputStreamReader (new FileInputStream (file))) {
        int data;
        while ( (data = reader.read ()) != -1) {
            builder.append ((char) data);
        }
    } catch (IOException e) {
        throw new RuntimeException ("IO Exception: " + e.getMessage (), e);
    }
    return builder.toString ();
}

这样,您的阅读器始终处于关闭状态,在这种情况下,不需要finally块。

这是因为Reader实现了try-with-resources-Statement。如果您有以下代码:

try (AutoCloseable ac = /*create object here*/ {
//bla bla, do something with ac
}

JVM 保证在ac!*

上调用close()

*当然,除非JVM被自杀。

答案 2 :(得分:0)

float toRangeValue = (float)multipliedSelectedValue / (float)multipliedMaxValue;

我不会改变

答案 3 :(得分:0)

finally部分始终执行,无论try内的代码是否正确执行,或者抛出异常。因此,您可以删除catch块,但必须记住将IOException添加到方法签名中(因为已选中)。

此外,如果您使用Java 7,则可以使用try-with-resources