2

NPE的问题根本不应该为空,请帮助

大家好,我有这段代码在表格中显示一个对象,方法 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);
    }
}

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

4

5 回答 5

2

这是因为它没有识别t1出来,即使它显然在课堂上

它在课堂上,但它是否已初始化?引用类型字段的默认值为null因此如果您t1在尝试对其调用非静态方法之前从未分配给任何内容,您将得到一个NullPointerException(因为t1会是null)。在您的情况下,您分配的唯一位置t1是在方法中,因此如果您在调用之前savet不调用此方法,则仍然是.displayTeachers t1null

于 2012-11-22T16:23:40.177 回答
1

你说你从不同的类中调用这两种方法。你确定你在 Display 的同一个实例上调用这些方法吗?您可能只需要一个 Display 实例,因此您应该使用单例设计模式,以确保只有一个实例。

另一个观察结果是,在你的方法中:

        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 实例时:而不是Display d = new Display();键入:Display d = Display.getInstance(); 这样,将只有一个 Display 实例,并且您将在两个类中引用相同的对象。

于 2012-11-22T17:20:37.390 回答
0

确保在调用displayTeachers()之前调用savet(SubjectTeacher)方法。我的猜测是您正在调用displayTeachers()并且尚未调用savet(SubjectTeacher) 。也是如此,当您尝试从.t1nullNullPointerExceptiont1

于 2012-11-22T16:28:40.867 回答
0

那么是savet从不同的线程调用的displayTeachers吗?如果是这样,请尝试替换public SubjectTeacher t1;public volatile SubjectTeacher t1;

于 2012-11-22T16:24:46.837 回答
0

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

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

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

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

于 2012-11-23T08:49:59.107 回答