Class中的空指针异常(代码似乎很好)Java

时间:2012-11-22 16:16:48

标签: java swing nullpointerexception

NPE的问题根本不应该是空的,Plz帮助

大家好,我有这个代码在表格中显示一个对象 方法savet将对象保存到该类中,以便可以引用它,并且它可以工作(尝试和测试),但是当我尝试调用方法displayTeacher时,我得到一个空指针异常。这是因为它没有识别t1,即使它明显在课堂上,即使作为一个属性

public class Display
{
    private JTable table;
    private JFrame f;
    private int i = 0;
    public SubjectTeacher t1;

    public void savet (SubjectTeacher teachIn)
    {
        SubjectTeacher tempt = new SubjectTeacher(teachIn.getName(), teachIn.getSurname(), teachIn.getID(), teachIn.getPay(), teachIn.getSubjectID());
        t1 = tempt;
    }

    public void displayTeachers()
    {
        f = new JFrame("Teachers");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(500,400);
        f.setVisible(true);

        String[] columnNames =  {"Name", "Surname", "ID", "Pay", "Subject"};
        Object[][] data = {
            {
             t1.getName(),
             t1.getSurname(),
             t1.getID(),
             t1.getPay(),
             t1.getSubjectID()
            }
          };
    JTable table = new JTable (data, columnNames);
    f.add(table);
    }
}

非常感谢任何帮助,因为我必须尽快完成学校项目,  谢谢,马特

5 个答案:

答案 0 :(得分:2)

  

这是因为它无法识别t1,即使它明显属于班级

它在课堂上,但它是否已初始化?引用类型字段的default valuenull,因此如果您在尝试调用非静态方法之前从未将t1指定给任何内容,则会获得NullPointerException(从t1将是null)。在您的情况下,您指定t1的唯一地点位于savet方法中,因此如果您未在之前调用此方法,请致电displayTeachers { {1}}仍然是t1

答案 1 :(得分:1)

你说你从不同的类中调用了2个方法。您确定在同一个Display实例上调用方法吗?您可能只需要一个Display实例,因此您应该使用Singleton Design Pattern,以确保只有一个实例。

另一个观察是你的方法:

        public void savet (SubjectTeacher teachIn)
            {
                SubjectTeacher tempt = new SubjectTeacher(teachIn.getName(), teachIn.getSurname(), teachIn.getID(), teachIn.getPay(), teachIn.getSubjectID());
                t1 = tempt;
            }

如果你写t1=teachIn会更容易,并且效果会相同。

编辑: 您的Display类应如下所示:

    import javax.swing.JFrame;
    import javax.swing.JTable;

    public class Display {
        private static Display instance;
        private JFrame f;
        public SubjectTeacher t1;

        private Display() {
        }

        public static Display getInstance() {
            if (instance == null) {
                instance = new Display();
            }

            return instance;
        }

        public void savet(SubjectTeacher teachIn) {
            t1 = teachIn;
        }

        public void displayTeachers() {
            f = new JFrame("Teachers");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(500, 400);
            f.setVisible(true);

            String[] columnNames = { "Name", "Surname", "ID", "Pay", "Subject" };
            Object[][] data = { { t1.getName(), t1.getSurname(), t1.getID(),
                    t1.getPay(), t1.getSubjectID() } };

            f.add(new JTable(data, columnNames));
        }
    }

如果要创建新的显示实例: 而不是Display d = new Display();您应该输入:Display d = Display.getInstance(); 这样,只有一个Display实例,你将在两个类中引用相同的对象。

答案 2 :(得分:0)

savet是否从另一个线程调用displayTeachers?如果是,请尝试将public SubjectTeacher t1;替换为public volatile SubjectTeacher t1;

答案 3 :(得分:0)

在致电 displayTeachers()之前,请确保拨打 savet(SubjectTeacher)方法。我的猜测是你正在调用 displayTeachers(),并且尚未调用 savet(SubjectTeacher)。因此t1null,当您尝试从NullPointerException获取数据时,您将获得t1

答案 4 :(得分:0)

您提到在其他两个类中使用Display类。

你有2个不同的实例吗?或者换句话说:你是否在两个班级中都致电new Display()

如果是这样,您是否100%确定在两个类中调用savet()方法?

有可能为一个实例化调用savet(),为另一个实例调用displayTeachers()。这肯定会导致您的NPE问题。