我认为这可能是范围问题,但是困扰了我一段时间。每当我尝试将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,然后追溯到您的代码中以了解原因。您会一次又一次地遇到这些,请相信我。