Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在静态块内的try-catch块中指定最终字段会被拒绝?_Java_Static_Initialization_Final - Fatal编程技术网

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。