所以我在没有方法和参数传递的情况下编写了这段代码,它的工作非常出色!
但是一旦我开始使用方法和传递参数使其更有条理,我就遇到了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);
}
}
答案 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);