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

Java 使用另一个类中的方法时出错,java,swing,Java,Swing,我认为这可能是一个范围问题,但它一直困扰着我一段时间。每当我尝试向帧添加ReplayData时,我都会收到一个空指针错误,如果不抛出空指针错误,我也不能使用add data方法。p、 Setx确实设置了正确的值,但一旦它点击“replaydata.add”,就会抛出一个错误,循环无法继续 public ReplayData replayData; frame = new JFrame(); frame.setBounds(100, 100, 1920, 1080);

我认为这可能是一个范围问题,但它一直困扰着我一段时间。每当我尝试向帧添加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();  
        }
    });
}

任何帮助都将不胜感激


如果有人想在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();