2

まったくヌルであってはならないNPEの問題、Plzヘルプ

こんにちはみんな、私はテーブルにオブジェクトを表示するこのコードを持っていますメソッドsavetはオブジェクトをそのクラスに保存して参照できるようにし、それは機能します(試してテストしました)が、メソッドdisplayTeacherを呼び出そうとするとnullポインターを取得します例外。これは、t1がクラスに明確に含まれているにもかかわらず、属性としても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

1

あなたは、異なるクラスから2つのメソッドを呼び出すと言いました。Display の同じインスタンスでメソッドを呼び出してもよろしいですか? おそらく Display のインスタンスは 1 つしか必要ないため、Singleton Design Pattern を使用して、インスタンスが 1 つだけになるようにする必要があります。

別の観察結果は、あなたの方法であるということです:

        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 のインスタンスは 1 つだけになり、両方のクラスで同じオブジェクトを参照することになります。

于 2012-11-22T17:20:37.390 に答える
0

Displayクラスを他の2つのクラスで使用していると述べています。

2 つの異なるインスタンス化がありますか? new Display()言い換えれば、両方のクラスでコールしますか?

もしそうなら、あなたは両方のクラスでメソッドを呼び出すことを 100% 確信していますsavet()か?

savet()1 つのインスタンス化と別のインスタンス化を呼び出す可能性がありdisplayTeachers()ます。これは間違いなくNPEの問題になります。

于 2012-11-23T08:49:59.107 に答える
0

displayTeachers()を呼び出す前に、 savet(SubjectTeacher)メソッドを呼び出していることを確認してください。私の推測では、displayTeachers()を呼び出しており、savet(SubjectTeacher)は呼び出されていません。からデータを取得しようとすると、 が取得されます。t1nullNullPointerExceptiont1

于 2012-11-22T16:28:40.867 に答える