Java 使用另一个类中的方法时出错
我认为这可能是一个范围问题,但它一直困扰着我一段时间。每当我尝试向帧添加ReplayData时,我都会收到一个空指针错误,如果不抛出空指针错误,我也不能使用add data方法。p、 Setx确实设置了正确的值,但一旦它点击“replaydata.add”,就会抛出一个错误,循环无法继续Java 使用另一个类中的方法时出错,java,swing,Java,Swing,我认为这可能是一个范围问题,但它一直困扰着我一段时间。每当我尝试向帧添加ReplayData时,我都会收到一个空指针错误,如果不抛出空指针错误,我也不能使用add data方法。p、 Setx确实设置了正确的值,但一旦它点击“replaydata.add”,就会抛出一个错误,循环无法继续 public ReplayData replayData; frame = new JFrame(); frame.setBounds(100, 100, 1920, 1080);
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();
}
});
}
任何帮助都将不胜感激
如果有人想在eclipse上打开我的项目,请复制该项目(我已经包含了.csv,您需要在zip中使其正常工作):您声明变量:
public ReplayData replayData;
但永远不要初始化它。您上面的行相当于:
public ReplayData replayData = null;
您需要为变量分配一个对象,使其非空
public ReplayData replayData = new ReplayData();
更重要的是,您需要学习如何调试NPE(NullPointerException)的一般概念您应该仔细阅读异常的stacktrace,找到出错的代码行,即引发异常的代码行,然后仔细检查该行,找出哪个变量为null,然后回溯到代码中以了解原因。相信我,您会一次又一次地遇到这些问题。您看到了什么错误?顺便说一下,不建议这样做:
frame.getContentPane().setLayout(null)代码>。虽然空布局和setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当放置在滚动窗格中时,它们会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕。我发现了空指针错误。当我在eclipse中使用swing编辑器时,这些代码是自动生成的,如果这是一个值得警惕的问题,谢谢你的建议,我将删除它并研究其效果。这是我为你编译时的一个控制台截图哇,我真的很喜欢这张截图,谢谢你指出了这张截图!我不认为您可以帮助我使用GUI,当我调用paint方法时,它仍然没有做任何事情。我尝试在输入绘画时添加一个弹出的消息框,但没有显示任何内容@不计算:我猜-你使用null
layouts可能会伤到自己的脚。如果添加ReplayData时未设置其边界,则其大小将为0x0。但不要猜测,添加一个边框,看看它的大小。不过,我的主要建议是避免像瘟疫一样的null
布局,这不仅仅是因为它将您的GUI标记为新手GUI,而是因为它们很难调试和增强。干杯,我从来没有这么高兴看到屏幕上出现一些点。不太清楚我是如何修复的,尽管我不认为挫折实际上限制了数据在一分钟内的绘制位置,也许是清除空值救了我,再次感谢你的建议。这里有一张我当时的照片;我有。我希望每当我在集群上单击+/-时屏幕都会刷新,但似乎无法使其工作。我尝试过从框架中删除并重新添加,但效果不大。新的质心肯定正在重新计算
public ReplayData replayData = null;
public ReplayData replayData = new ReplayData();