Почему я получаю исключение с нулевым указателем при попытке доступа к объекту?

#java #object #nullpointerexception #accessor

#java #объект #исключение nullpointerexception #средство доступа

Вопрос:

Я просто пытаюсь получить доступ к статическому объекту, содержащему информацию о сотруднике, из основного класса драйвера. Но когда я пытаюсь сделать это, используя его метод getter, я получаю старые данные о сотрудниках из другого класса.

исключение в потоке awt event приводит к нулевому исключению java.lang с нулевым указателем…

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

 guiEmployee1 theGuiEmployee = new guiEmployee1();
  

Это еще один класс, который позволяет пользователю вводить все данные сотрудника, а затем создает новый объект employee с этой информацией.

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

 public void addInfoToSystem()
{
    System.out.println("about to add data to system");
    Employee aEmployee = theGuiEmployee.getEmployee();
}
  

И это весь класс gui employee, который позволяет пользователю вводить данные сотрудника и создает новый объект employee, о котором я упоминал ранее. Он содержит метод получения.

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class guiEmployee1 extends JFrame
{
    private static Employee theEmployee;

    private String fName;
    private String sName;
    private String gender;
    private String pLevel;
    private String empIDnumber;
    private int dPayLevel, i=0;

    JTextField employeeDetails1;
    JTextField employeeDetails2;
    JTextField employeeDetails3;    
    JTextField employeeDetails4;
    JTextField employeeDetails5;

    private static ArrayList<Employee> allEmployees = new ArrayList<Employee>();

    public guiEmployee1()
    {
        JButton submit;
        JButton b1;

        System.out.println("cabanas");

        JFrame frame = new JFrame();

        employeeDetails1 = new JTextField(10);
        employeeDetails2 = new JTextField(10);
        employeeDetails3 = new JTextField(10);
        employeeDetails4 = new JTextField(10);
        employeeDetails5 = new JTextField(10);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(320, 75));
        frame.setTitle("Employee Details");

        frame.setLayout(new FlowLayout());

        frame.add(new JLabel("Please enter Employees first Name: "));
        frame.add(employeeDetails1);
        ButtonListenerDepName listener = new ButtonListenerDepName();

        frame.add(new JLabel("Please enter Employees Last Name: "));
        frame.add(employeeDetails2);
        ButtonListenerDepName1 listener1 = new ButtonListenerDepName1();

        frame.add(new JLabel("Please enter Employees Gender: "));
        frame.add(employeeDetails3);
        ButtonListenerDepName2 listener2 = new ButtonListenerDepName2();

        frame.add(new JLabel("Please enter Employees Pay Level: "));
        frame.add(employeeDetails4);
        ButtonListenerDepName4 listener4 = new ButtonListenerDepName4();

        frame.add(new JLabel("Please enter Employees ID Number: "));
        frame.add(employeeDetails5);
        empIDnumber = employeeDetails5.getText();

        createNewDepartment listener5 = new createNewDepartment();

        b1 = new JButton("Submit");

        b1.addActionListener(listener5);
        b1.addActionListener(listener4);

        b1.addActionListener(listener2);
        b1.addActionListener(listener1);
        b1.addActionListener(listener);

        frame.add(b1);
        frame.pack();
        frame.setSize(300,300);
        frame.setVisible(true);
    }

    public class ButtonListenerDepName implements ActionListener
    {
        public void actionPerformed (ActionEvent e )
        {
             fName = employeeDetails1.getText();
            System.out.println("and This is the employes first name :"  fName);         
        }
    }

    public class ButtonListenerDepName1 implements ActionListener
    {
        public void actionPerformed (ActionEvent e )
        {
             System.out.println("and we get to depname1");
             sName = employeeDetails2.getText();
            System.out.println("and This is the emp scnd name :"  sName);   
        }
    }

    public class ButtonListenerDepName2 implements ActionListener
    {
        public void actionPerformed (ActionEvent e )
        {
             System.out.println("and we get to depname2");
             gender = employeeDetails3.getText();
            System.out.println("and This is the employes gender:"  gender);         
        }
    }

    public class ButtonListenerDepName3 implements ActionListener
    {
        public void actionPerformed (ActionEvent e )
        {
             System.out.println("and we get to depname3");
             empIDnumber = employeeDetails3.getText();
            System.out.println("and This is the emp id: "  empIDnumber);    
        }
    }

    public class ButtonListenerDepName4 implements ActionListener
    {
        public void actionPerformed (ActionEvent e )
        {
                System.out.println("and we get to depname4");

                try
                {
                pLevel = employeeDetails4.getText();        
                dPayLevel = Integer.parseInt(pLevel);
                }
                catch (NumberFormatException nfe)
                {
                    pLevel = "-1";
                    dPayLevel = Integer.parseInt(pLevel);
                }

    //      System.out.println("and This is the emp pay level :"  dPayLevel);   
        }
    }

    public class createNewDepartment implements ActionListener
    {
        public void actionPerformed (ActionEvent e )
        {
            //create a new department and then adds it to thee system
            theEmployee = new Employee(fName, sName, gender, dPayLevel, empIDnumber);

            storageSystem theStorageSystem = new storageSystem();
            theStorageSystem.setEmployee(theEmployee);
            System.out.println("mazel tov they have all been added in the gui employee");
            System.out.println(theEmployee);
        }
    }

    public Employee getEmployee()
    {
        return theEmployee;
    }

    public int getValue()
    {
         i = 1;
        return i;   
    }

}
  

Комментарии:

1. В какой строке кода вы получаете NPE?

2. Где находится код создания экземпляра относительно addInfoToSystem?

3. Шаблон «как отладить NPE:» Поставьте точку останова в строке, которая выдает NPE. Запустите свою программу в режиме отладки. Когда будет достигнута точка останова, посмотрите, какая переменная null , которую код попытается разыменовать.

4. Я получаю его в основном методе в строке 4 Employee aEmployee = theGuiEmployee.getEmployee();

5. theGuiEmployee является null . У вас есть код создания экземпляра, но поскольку вы не предоставляете его нам в контексте, мы не можем оценить, почему он не был выполнен в точке, которую вы вводите addInfoToSystem

Ответ №1:

Эй, вы только что создали ссылку, экземпляр объекта не был создан. Сначала создайте объект, затем вызовите его метод, потому что вызов метода находится в памяти в форме стека, и он ссылается на созданный (созданный экземпляр) объект в памяти кучи, если объект не создан, метод выдаст исключение..

Комментарии:

1. Но у меня в строке 174 есть Employee = новый сотрудник (имя_файла, sName, пол, dPayLevel, empIDnumber);

2. @OP В вашем конструкторе нет инициализации. Смотрите мой ответ. : )

3. Добавьте метод setEmployee, как упоминал LiuwkCn, или измените метод getEmployee как общедоступный статический Employee getEmployee() { if(this==null) { return new Employee(); } else верните это; }

4. В любом случае должен быть предоставлен метод установки. Переменная ‘theEmployee’ никогда не инициализируется.

5. Экземпляр @SashiKant theEmployee не был создан до createNewDepartment вызова. Если getEmployee вызывается до createNewDepartment , он вернет null . Однако, если вы получаете NPE в строке, Employee aEmployee = theGuiEmployee.getEmployee(); как вы указали, NPE происходит потому, что theGuiEmployee равно нулю, а не потому, что getEmployee возвращено значение null. Если вы получаете NPE где-то еще, то это может быть потому, что getEmployee возвращено значение null.