Зачем мне получать исключение нулевого указателя с помощью методов ввода и прослушивания Gui? - PullRequest
2 голосов
/ 16 октября 2011

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

Моя проблема в том, что, когда я ввожу первое имя, оно работает отлично, но когда я ввожу фамилию, оно не работает вообще, я нажимаю кнопку отправки, и все это сходит с ума, ошибкаисключение нулевого указателя "Очередь событий AWT".И я не вижу причин, по которым это происходит. PLS Help

Это код ошибки в строке

lName = employeeDetails2.getText();  (located closer to the end of the code)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class guiEmployee1 extends JFrame
{

    private String  fName;
    private String  lName;
    private String  gender;
    private String  payLevel;
    private String  empIDnumber;
//  private int dPayLevel; 

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

    public guiEmployee1()
    {
        JButton submit;
        JButton b1;

        System.out.println("cabanas");

        JFrame frame = new JFrame();
        employeeDetails1 = new JTextField(10);

        JTextField employeeDetails2;
        employeeDetails2 = 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);
        ButtonListenerFirstName listener = new ButtonListenerFirstName();

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




        b1  = new JButton  ("Submit");

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


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



    }


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

    public class ButtonListenerLastName implements ActionListener
    {
        public void actionPerformed (ActionEvent e )
        {
             lName = employeeDetails2.getText();
            System.out.println("and This is the employes Last name :"+ lName);      
        } 
    }




    public static Department getDepartment()
    {
        return null;
    }


}


Thanks 

Ответы [ 2 ]

4 голосов
/ 16 октября 2011

Переменная only , которая в этой строке имеет значение null и вызывает это исключение employeeDetails2, поэтому вы должны оглянуться назад в своем коде, чтобы увидеть, назначаете ли вы объект этой переменной и где именно. После этого вы увидите, что вы присваиваете объект employeeDetails2 в конструкторе класса guiEmployee1, но сразу после этого вы повторно объявляете переменную в конструкторе. Таким образом, локальной переменной employeeDetails2 был присвоен объект, а не поле класса, которое никогда не инициализируется. Это называется изменением теней. Решение не состоит в том, чтобы повторно объявить переменную в конструкторе.

т.е:.

public guiEmployee1()
{
    JButton submit;
    JButton b1;

    System.out.println("cabanas");

    JFrame frame = new JFrame();
    employeeDetails1 = new JTextField(10);

    //  JTextField employeeDetails2; ***** comment out this line *****
    employeeDetails2 = new JTextField(10);

Далее, вы захотите переименовать ваши переменные, чтобы ваш код стал «комментировать». Другими словами, вместо того, чтобы давать переменной такое общее имя, как employeeDetailsX, почему бы вместо этого не назвать его lastNameField, а перед ним firstNameField и кнопку «b1» для submitButton? Таким образом, при отладке кода вы будете точно знать, что он должен делать?

3 голосов
/ 16 октября 2011

Я не проверял это, но я думаю, что проблема:

JTextField employeeDetails2;
employeeDetails2 = new JTextField(10);

просто оставьте декларацию, и она сработает.

employeeDetails2 = new JTextField(10);
...