Java 如何修复NullPointerException并将数据放入NatTable

Java 如何修复NullPointerException并将数据放入NatTable,java,nullpointerexception,swt,nattable,Java,Nullpointerexception,Swt,Nattable,当我尝试使用这段代码时: students.add(new Student("John","1", 3)); students.add(new Student("Chris","2", 2)); NatTable table = createTable(shell, students); table.refresh(); 出现NullPointerException,可能是因为学生类中的getter或生成表时出错。出现此问题时的另一条消息是ReflectVersionPropertyAcces

当我尝试使用这段代码时:

students.add(new Student("John","1", 3));
students.add(new Student("Chris","2", 2));
NatTable table = createTable(shell, students);
table.refresh();
出现NullPointerException,可能是因为学生类中的getter或生成表时出错。出现此问题时的另一条消息是ReflectVersionPropertyAccessor.getDataValue。此外,我还需要修复NatTable中的ColumnGroup以正确显示许多检查

它给了我(代码中的第48行是学生构造函数):

我最初的考试和学生课程。

public static class Student {
    private String name;
    private String groupNumber;
    private Exam[] exams;
    public Student() { }
    public Student(String name, String groupNumber, int numbOfExams) {
        this.name = name;
        this.groupNumber = groupNumber;
        this.exams = new Exam[numbOfExams];
        for(int i=0;i<numbOfExams;i++) {
            exams[i]= new Exam();
            this.exams[i].setName("");
            this.exams[i].setMark(0);
        }           
    }
    public String getName() {
        return name;
    }
    public String getGroupNumber() {
        return groupNumber;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setGroupNumber(String groupNumber) {
        this.groupNumber = groupNumber;
    }
    public void setExam(Exam[] exams) {
        this.exams = exams;
    }
    public Exam[] getExam() {
        return exams;
    }       
}
public static class Exam {
    private String name;
    private int mark;
    public Exam() { }
    public Exam(String name, int mark) {
        this.name = name;
        this.mark = mark;
    }
    public String getName() {
        return name;
    }
    public int getMark() {
        return mark;
    }    
    public void setName(String name) {
        this.name = name;
    }
    public void setMark(int mark) {
        this.mark = mark;
    }
}
公共静态类学生{
私有字符串名称;
私有字符串组号;
私人考试[]考试;
公立学生(){}
公立学生(字符串名称、字符串组号、整数){
this.name=名称;
this.groupNumber=groupNumber;
this.exams=新考试[numbOfExams];

对于(inti=0;i,您的问题是您有嵌套对象,并且希望通过反射来访问它们。这不起作用

如果您的学生只有一次考试,您需要将属性名称更改为:

String[] propertyNames = { "name", "groupNumber", "exam.name", "exam.mark" };
以及数据提供者对此的定义:

IDataProvider bodyDataProvider =
            new ListDataProvider<>(
                    students,
                    new ExtendedReflectiveColumnPropertyAccessor<Student>(propertyNames));
IDataProvider bodyDataProvider=
新ListDataProvider(
学生,
新的ExtendedReflectColumnPropertyAccessor(propertyNames));
但是你的
Student
类有一个
EXAME
对象数组。你想如何在表中可视化这样一个树结构呢?NatTable可以做到这一点,但是你需要更多的东西,比如
TreeLayer
等,而这反过来又不适用于你的数据结构


我建议您首先考虑您想要可视化的内容,然后检查哪个控件适合您的需要(是表还是树?),然后检查一些确实存在的教程,如或或

在哪一行获得NPE?没有stacktrace,没有行号,…任何人都能提供帮助吗?第一个代码段没有说明任何有关
shell
实例的内容。您从哪里获得它或如何创建它?以及您的代码如何编译调用
this.tests[i].setMark();
和方法签名
setMark(int-mark)
需要一个int值?首先,您使用的是NatTable的一个古老版本。大约六年前,当我们迁移到Eclipse时,SourceForge版本已经被弃用了好几年。您将无法获得对该版本的太多支持,并且可能会遇到许多问题。我不明白为什么人们仍然使用该版本。其次,您已经对象(考试在Student下方),您希望可以通过反射神奇地检查此对象?实现自定义数据提供程序或使用具有正确属性定义的ExtendedReflectDataProvider。查看我们的入门教程可能会有所帮助。
String[] propertyNames = { "name", "groupNumber", "exam.name", "exam.mark" };
IDataProvider bodyDataProvider =
            new ListDataProvider<>(
                    students,
                    new ExtendedReflectiveColumnPropertyAccessor<Student>(propertyNames));