我想制作result
变量final
,如何构建此代码以便干净地编译?我知道我过去已经这样做了,但我不记得我是如何构建它以使其工作的。
以下代码是一个straw man
示例,我正在尝试清理的代码要复杂得多,这只是提炼我想要完成的内容。
private boolean someMethod()
{
final boolean result;
try
{
// do the logic here that might throw the following
// exceptions
}
catch (final IOException ioe)
{
result = false;
}
catch (final ClassNotFoundException cnfe)
{
result = false;
}
return result;
}
我不能将result = true
放在try
块中,因为它不会编译,两个catch块都抱怨可能已经分配了最终变量。
我无法将其放在finally
区块中,因为这会产生与try
区块相同的投诉吗?
我希望能够只设置一次result =
。
那么你在哪里设置result = true;
以便干净地编译它?
答案 0 :(得分:3)
不设置变量要简单得多。
private boolean someMethod() {
try {
// do the logic here that might throw the following
return true;
} catch (IOException ioe) {
// handle IOE
} catch (ClassNotFoundException cnfe) {
// handle CNFE
}
return false;
}
答案 1 :(得分:2)
尝试使用final
强制执行“只分配一次”总是很棘手。您可以使用第二个变量:
private boolean someMethod()
{
boolean res;
try
{
// do the logic here that might throw the following
// exceptions
}
catch (final IOException ioe)
{
res = false;
}
catch (final ClassNotFoundException cnfe)
{
res = false;
}
final boolean result = res;
return result;
}
但真正的问题是,为什么不删除final
限定符?
答案 2 :(得分:1)
您无法将值重新分配给final
变量,因此这是不可能的。
编辑:想要将方法本地的变量声明为final
并且也在同一方法中更改值也是一个矛盾 - 为什么有必要将其声明为final
在这种方法中呢?
答案 3 :(得分:0)
如果在方法中将局部变量声明为final
,则无法在方法中更改该变量的值。
从final
的声明中删除result
,或者完全删除result
局部变量并直接从catch
块内返回并返回方法