我有一个现有的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();
}
答案 0 :(得分:2)
您不需要 catch
阻止使用try
... finally
。嵌套异常更难阅读,因此我将其排除在外。
答案 1 :(得分:1)
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。