簡體   English   中英

為什么拒絕在靜態塊內的try-catch塊中分配最終字段?

[英]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的最佳方法是使用一個臨時變量,並在finallynum_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM