Java中的空指针异常错误

时间:2011-11-08 05:07:34

标签: java nullpointerexception jlabel

所以我在没有方法和参数传递的情况下编写了这段代码,它的工作非常出色!

但是一旦我开始使用方法和传递参数使其更有条理,我就遇到了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);
    }

}

7 个答案:

答案 0 :(得分:2)

问题在于这个功能:

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");
}

答案 1 :(得分:1)

 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作为参数传递给它,因为您在类'global scope。中声明了label

private static void initializeFrame(){
    JFrame frame = new JFrame();
    frame.add(label);
    frame.setVisible(true);
}

答案 2 :(得分:1)

这是因为您在方法中初始化label,因此它的范围仅适用于您的方法initializeLabel()。你应该使label成为一个全局变量,然后在你的方法中进行初始化,这样你的整个程序就可以访问它。

答案 3 :(得分:1)

因为在initializeLabel中你创建了一个新标签,但你没有将它的引用分配给静态变量,而是分配给方法执行后丢失的局部变量。

更改为:

private static void initializeLabel(){
    label = new JLabel();

    label.setText("hi");

} 

答案 4 :(得分:1)

当你这样做时:

JLabel label = new JLabel();

initializeLabel()内,这是一个新的本地变量,而不是您认为正在设置的对象级别变量。因此,对象级别1仍设置为其默认值null。

如果你想影响对象级别,只需这样设置:

label = new JLabel();

答案 5 :(得分:1)

将第15行更改为:

    label = new JLabel();

否则您重新定义了标签。

答案 6 :(得分:1)

由于您正在将未初始化的JLabel解析为initializeFrame(JLabel label)方法,因此您将获得此异常。

在解析为label方法之前初始化initializeFrame(JLabel label)

initializeLabel();
label =  new JLabel("Your label Name ...");
initializeFrame(label);