使用另一个类的方法时出错

时间:2015-04-02 00:09:20

标签: java swing

我认为这可能是一个范围问题,但它一直困扰着我。每当我尝试将ReplayData添加到帧时,我都会收到空指针错误,也不能使用我的添加数据方法而不会抛出空指针错误。 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();
}

}

public class 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你需要让它在拉链上工作):http://www.filedropper.com/eyetrackeranalysis_1

1 个答案:

答案 0 :(得分:2)

您声明变量:

public ReplayData replayData;

但永远不会初始化它。您的上述行等同于:

public ReplayData replayData = null;

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

public ReplayData replayData = new ReplayData();

更重要的是,您需要学习如何调试NPE(NullPointerException)的一般概念。 你应该批判性地阅读你的异常堆栈跟踪以找到错误的代码行,抛出异常的行,然后仔细检查该行,找出哪个变量为null,然后追溯到你的代码,看看为什么。你会一次又一次地碰到这些,相信我。