[英]Null Pointer Exception Error in Java
因此,我在沒有方法和參數傳遞的情況下編寫了這段代碼,而且效果出色!
但是一旦我開始使用方法和傳遞參數來使其更有條理,我就會遇到Null Pointer Exception。 為什么會出現這樣的錯誤?
import javax.swing.JFrame;
import javax.swing.JLabel;
public class test {
private static JLabel label;
public static void main(String[] args){
initializeLabel();
initializeFrame(label);
}
private static void initializeLabel(){
JLabel label = new JLabel();
label.setText("hi");
}
private static void initializeFrame(JLabel label){
JFrame frame = new JFrame();
frame.add(label);
frame.setVisible(true);
}
}
問題是這個功能:
private static void initializeLabel(){
JLabel label = new JLabel(); // This creates a new variable named label
label.setText("hi");
}
您正在嘗試初始化this.label
,但是您只是在創建一個新變量並對其進行分配。 更改為此:
private static void initializeLabel(){
label = new JLabel(); // or this.label = new JLabel();
label.setText("hi");
}
private static void initializeFrame(JLabel label){
JFrame frame = new JFrame();
frame.add(label); <-- Here it might be throwing NPE because label is not initialized and is null.
frame.setVisible(true);
}
您尚未初始化全局label
變量,這就是為什么要接收NPE的原因。 不要在initializeLabel()
方法中創建新標簽,否則要在其中初始化全局變量。 所以看起來像這樣...
private static void initializeLabel(){
label = new JLabel();
label.setText("hi");
}
還要將initializeFrame(JLabel label)
更改為initializeFrame()
。 因為您已經在類的全局范圍內聲明了label
,所以無需在其中傳遞標簽作為參數。
private static void initializeFrame(){
JFrame frame = new JFrame();
frame.add(label);
frame.setVisible(true);
}
這是因為您在方法內部初始化了label
所以它的作用域僅是您的方法initializeLabel()
。 您應該使label
為全局變量,然后在您的方法中進行初始化,這樣您的整個程序都可以訪問它。
因為在initializeLabel中創建了一個新標簽,但是您沒有將對它的引用分配給靜態變量,而是分配給在方法執行后丟失的局部變量。
改成:
private static void initializeLabel(){
label = new JLabel();
label.setText("hi");
}
當您這樣做時:
JLabel label = new JLabel();
在initializeLabel()
,這是一個新的局部變量,而不是您認為要設置的對象級變量。 因此,對象級別1仍設置為其默認值null。
如果要影響對象級別的對象,只需進行以下設置:
label = new JLabel();
將第15行更改為:
label = new JLabel();
否則,您將重新定義標簽。
由於您正在將未初始化的JLabel
解析為initializeFrame(JLabel label)
方法,因此您將獲得此異常。
初始化label
解析到前initializeFrame(JLabel label)
的方法。
initializeLabel();
label = new JLabel("Your label Name ...");
initializeFrame(label);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.