我认为这可能是范围问题,但是困扰了我一段时间。每当我尝试将ReplayData添加到框架时,我都会收到一个空指针错误,也不能使用我的add data方法而不抛出空指针错误。 p.Setx肯定会设置正确的值,但是一旦它到达“ replaydata.add”,就会引发错误,并且循环无法继续。

    public ReplayData replayData;

    frame = new JFrame();
    frame.setBounds(100, 100, 1920, 1080);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    // ERROR HERE WHEN ADDING TO FRAME, APPLICATION RUNS FINE IF COMMENTED
    //frame.add(replayData); // Add replay data to jframe

    JButton button_KMeans = new JButton("View K-Means");
    button_KMeans.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            kMeans.initialize();
            kMeans.kMeanCluster();
            kMeans.PrintResults();

            //for (Point p : kMeans.getPoints() )

            Point temp = new Point();
            for (int i = 0; i < kMeans.TOTAL_DATA; i++)
            {
                //JOptionPane.showMessageDialog(new JFrame(),kMeans.TOTAL_DATA, "Dialog",
                //        JOptionPane.ERROR_MESSAGE);;
                p.setX((int)TrackerData.getRecordNumber(i).getEyeX());
                p.setY((int)TrackerData.getRecordNumber(i).getEyeY());

                JOptionPane.showMessageDialog(new JFrame(),p.getX(), "Dialog",
                        JOptionPane.ERROR_MESSAGE);
                JOptionPane.showMessageDialog(new JFrame(),p.getY(), "Dialog",
                        JOptionPane.ERROR_MESSAGE);

                // GET ERROR HERE when adding these points to replayData. everything look fine in that class unless i'm missing something
                // java.lang.NullPointerException at MainWindow$3.actionPerformed(MainWindow.java:189)
                replayData.addPoint(p); // Add points to JPanel
            }
            //replayData.draw();
        }
    });


那是我的按钮类,每次尝试使用replaydata类添加数据时都会出错

继承人其他2 ReplayData + DataPoint类

import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.JPanel;

public class ReplayData extends JPanel {

public ArrayList<DataPoint> points;

// Initialise records
public ReplayData()
{
    points = new ArrayList<DataPoint>();
}

public void ReplaceData() {
    points = new ArrayList<DataPoint>();
}

public void addPoint(DataPoint point) {
    points.add(point);
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    for (DataPoint p : points)
        g.fillRect(p.x, p.y, 2, 2);
}

public void draw() {
    repaint();
}


}

公共类DataPoint {

public DataPoint(int X, int Y)
{
    x = X;
    y = Y;
}

public int getX() {
    return x;
}

public void setX(int x) {
    this.x = x;
}

public int getY() {
    return y;
}

public void setY(int y) {
    this.y = y;
}

int x,y;


}

任何帮助将非常感激。

我的项目的副本,如果有人想在Eclipse上打开它(我已经包含了.csv,您将需要使其在zip中正常运行):http://www.filedropper.com/eyetrackeranalysis_1

最佳答案

您声明变量:

public ReplayData replayData;


但不要初始化它。您上面的行与此等效:

public ReplayData replayData = null;


您需要为该变量分配一个对象,以使其非空。

public ReplayData replayData = new ReplayData();




更重要的是,您需要学习有关如何调试NPE的一般概念(NullPointerException)。您应该批判性地阅读异常的stacktrace,以查找出错的代码行,引发异常的行,然后仔细检查该行,找出哪个变量为null,然后追溯到您的代码中以了解原因。您会一次又一次地遇到这些,请相信我。

10-01 13:52