Ошибка исключения нулевого указателя в Java - PullRequest
1 голос
/ 08 ноября 2011

Так что я написал этот код раньше без методов и передачи параметров, и он работал великолепно!

Но как только я начал делать его более организованным с помощью методов и передачи параметров, я столкнулся с исключением из-за пустого указателя.Почему я получаю такую ​​ошибку?

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 ]

2 голосов
/ 08 ноября 2011

Проблема в этой функции:

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 голос
/ 08 ноября 2011

Поскольку вы анализируете неинициализированный JLabel для вашего initializeFrame(JLabel label) метода, вы получаете это исключение.

Инициализируйте label перед разбором по методу initializeFrame(JLabel label).

initializeLabel();
label =  new JLabel("Your label Name ...");
initializeFrame(label);
1 голос
/ 08 ноября 2011

Измените строку 15 на:

    label = new JLabel();

В противном случае вы переопределите метку.

1 голос
/ 08 ноября 2011

Когда вы делаете:

JLabel label = new JLabel();

в initializeLabel(), это новая локальная переменная, а не объектная, которую, как вы думаете, вы устанавливаете. Поэтому объектному уровню один по-прежнему присваивается значение по умолчанию, равное нулю.

Если вы хотите повлиять на объект первого уровня, просто установите его так:

label = new JLabel();
1 голос
/ 08 ноября 2011

Потому что в initializeLabel вы создаете новую метку, но не назначаете ссылку на нее статической переменной, а вместо этого на локальную переменную, которая теряется после выполнения метода.

Изменить на:

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

    label.setText("hi");

} 
1 голос
/ 08 ноября 2011

Это потому, что вы инициализируете label внутри метода, поэтому его область действия только для вашего метода initializeLabel()Вы должны сделать label глобальной переменной, а затем выполнить инициализацию в вашем методе, чтобы вся ваша программа имела к ней доступ.

1 голос
/ 08 ноября 2011
 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);
}
...