Java 为什么在静态块内的try-catch块中指定最终字段会被拒绝?
我正在尝试写以下课程:Java 为什么在静态块内的try-catch块中指定最终字段会被拒绝?,java,static,initialization,final,Java,Static,Initialization,Final,我正在尝试写以下课程: public class Secteur { private final static int num_secteur; static{ try { num_secteur = SecteurDAO.getCurrNumSecteur(); } catch (ClassNotFoundException | SQLException e) { e
public class Secteur {
private final static int num_secteur;
static{
try {
num_secteur = SecteurDAO.getCurrNumSecteur();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
但我有以下警告:
空白的最终字段num_secteur可能尚未初始化
SecteurDAO.getCurrenumSectEUR()
方法访问数据库,以获取将设置为num\u secteur字段的整数。我的代码有什么问题?调用
SecteurDAO.getCurrenumSectEUR()
可能会失败(引发异常),因此没有值可分配给num\u secteur
。因此,在出现异常的情况下,它可能不会被初始化
要解决此问题,您可能需要使用一些特殊值(例如-1)对其进行初始化,或者在catch块中设置该值
哦,删除
final
关键字,否则会出现错误消息“final field num_secteur可能已经被分配”。这是因为您只能将一个值赋给最终字段一次,即使您知道在发生异常时无法进行赋值(因为异常将在之前抛出)编译器无法确定这一点,因此会告诉您变量可能已被赋值。调用SecteurDAO.getCurrenumSectEUR()
可能会失败(引发异常),因此没有值可赋值给num\u secteur
。因此,在出现异常的情况下,它可能不会被初始化
要解决此问题,您可能需要使用一些特殊值(例如-1)对其进行初始化,或者在catch块中设置该值
哦,删除
final
关键字,否则会出现错误消息“final field num_secteur可能已经被分配”。这是因为您只能将一个值赋给最终字段一次,即使您知道在发生异常时无法进行赋值(因为异常将在之前抛出),编译器也无法确定这一点,因此会告诉您变量可能已被赋值。如前所述,如果存在异常,则可能不会在静态初始值设定项的末尾指定变量
您可能会考虑在try
块之前或catch
块之后为变量赋值,但这可能会导致为变量赋值两次,因此这是不允许的
您可能会考虑为catch
块中的变量指定一个无效值,但这仍然会导致为变量指定两个值
最好的方法是使用一个临时变量,并将其分配给finally
块中的num\u secteur
,这样可以只分配一次该变量,并且仍然保持num\u 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;
}
}
如前所述,如果存在异常,则可能不会在静态初始值设定项的末尾指定变量 您可能会考虑在
try
块之前或catch
块之后为变量赋值,但这可能会导致为变量赋值两次,因此这是不允许的
您可能会考虑为catch
块中的变量指定一个无效值,但这仍然会导致为变量指定两个值
最好的方法是使用一个临时变量,并将其分配给finally
块中的num\u secteur
,这样可以只分配一次该变量,并且仍然保持num\u 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;
}
}
因为在赋值之前可能会抛出异常。这样做的危险是什么?危险是您可能有一个未初始化的变量,如错误消息所示。如果你不能依赖它的初始化,你就必须在类尝试使用它时检查它是否被初始化。我个人的偏好不是在这种情况下使用静态块,而是使用静态方法返回值。优点是1)您可以命名该方法,使其明确其用途;2) 你不想让这个方法做很多事情,比如初始化多个变量;3) 您可以随时调用它,例如在单元测试中。因为在赋值之前可能会引发异常。这有什么危险?危险在于您可能有一个未初始化的变量,如错误消息所示。如果你不能依赖它的初始化,你就必须在类尝试使用它时检查它是否被初始化。我个人的偏好不是在这种情况下使用静态块,而是使用静态方法返回值。优点是1)您可以命名该方法,使其明确其用途;2) 你不想让这个方法做很多事情,比如初始化多个变量;3) 您可以在任何时候调用它,例如在单元测试中。但我想确保我的num_sectur字段永远不会被再次赋值。请在两个try/catch块中为temp_int赋值,然后在try/catch之后分配num_secteur=temp_int。但是我想确保我的num_secteur字段永远不会被分配。在两个try/catch块中为temp_int分配一个值,然后在try/catch之后分配num_secteur=temp_int。