[英]Why assigning a final field in a try-catch block within a static block is rejected?
我正在尝试编写以下课程:
public class Secteur {
private final static int num_secteur;
static{
try {
num_secteur = SecteurDAO.getCurrNumSecteur();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
但是我有以下警告:
空白的最终字段num_secteur可能尚未初始化
SecteurDAO.getCurrNumSecteur()
方法访问数据库,以获取将设置为num_secteur字段的整数。
我的代码有什么问题?
调用SecteurDAO.getCurrNumSecteur()
可能会失败(引发异常),因此没有赋值给num_secteur
值。 因此,在发生异常的情况下可能无法初始化。
要解决此问题,您可能想要使用一些特殊值(例如-1)对其进行初始化,或者在catch块中设置该值。
哦,并删除final
关键字,否则您将收到错误消息“可能已经分配了final字段num_secteur”。 那是因为您只能将一个值赋给final字段一次,即使您知道在发生异常的情况下也不会发生赋值(因为该异常将在之前抛出),编译器无法确定并因此告诉您该变量可能已被分配。
如前所述,如果存在异常,则可能不会在静态初始化程序的末尾分配该变量。
您可能会想到在try
块之前或catch
块之后分配变量,但这可能导致对该变量进行2次分配,因此是不允许的。
您可能会想到为catch
块中的变量分配一个无效值,但这仍然可能导致对该变量进行2次分配。
最好只分配一次此变量并保持num_secteur
final
的最佳方法是使用一个临时变量,并在finally
块num_secteur
其分配给num_secteur
。
private final static int num_secteur;
static
{
int test = -1; // Invalid value.
try {
test = SecteurDAO.getCurrNumSecteur();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
// Only assigned here, exactly once.
num_secteur = test;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.