大家好,我有这个代码在表格中显示一个对象 方法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);
}
}
非常感谢任何帮助,因为我必须尽快完成学校项目, 谢谢,马特
答案 0 :(得分:2)
这是因为它无法识别
t1
,即使它明显属于班级
它在课堂上,但它是否已初始化?引用类型字段的default value为null
,因此如果您在尝试调用非静态方法之前从未将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)。因此t1
为null
,当您尝试从NullPointerException
获取数据时,您将获得t1
。
答案 4 :(得分:0)
您提到在其他两个类中使用Display
类。
你有2个不同的实例吗?或者换句话说:你是否在两个班级中都致电new Display()
?
如果是这样,您是否100%确定在两个类中调用savet()
方法?
有可能为一个实例化调用savet()
,为另一个实例调用displayTeachers()
。这肯定会导致您的NPE问题。