[英]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.