簡體   English   中英

Java中的空指針異常錯誤

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

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