#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.