【问题标题】:NullPointerException error for adding to ArrayList via JFrame通过 JFrame 添加到 ArrayList 时出现 NullPointerException 错误
【发布时间】:2014-04-02 14:55:41
【问题描述】:

我的问题正如标题所说的那样。

我有一个 Tracker.class、一个 TrackerGUI.class 和一个 TrackerApp.class(JFrame 的驱动程序)。 Tracker 类在 TrackerGUI.class 中初始化为private Tracker tracker

代码本身编译正确(所以我猜这意味着没有语法错误,但是当我尝试添加一个对象时,终端弹出(我正在使用 BlueJ),并给我这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at TrackerGUI$Food.actionPerformed(TrackerGUI.java:121)

点击会引导我:

public class TrackerGUI extends JFrame {
    private Tracker tracker;
    double calories;
    double quantity;
    // more initialising of GUI elements; so all the JTextField things are initialised
    // setting up the GUI code, too

    public class Food implements ActionListener {
        public void actionPerformed (ActionEvent ae) {
            double calories = Double.parseDouble(caloriesField.getText().replaceAll(",",""));
            String newFood = activityField.getText();
            if(calories < 0) {
                textArea.append("Calories cannot be negative. \n\n"); 
            }
            else {
                tracker.addFood(newFood, calories); // this line!
                textArea.append(newFood + " with " + calories + " calories added to database! \n");
            }
        }
    }

在tracker类中,addFood的代码是这样的:

public class Tracker {
    ArrayList<Food> foodBase = new ArrayList<Food>();
    String foodName;
    Double calories;

public void addFood(String foodName, double calories)
{
    Food newFood = new Food(foodName, calories);
    foodBase.add(newFood);
}

我的代码中缺少什么?注意:我必须使用ArrayList,而我不能使用ListMap 我觉得我错过了一个for 声明,它得到foodBase.size(),但我不确定它适合哪里?

【问题讨论】:

  • 您是否在 TrackerGUI 中创建了 Tracker 的新实例?
  • 哪一行是:TrackerGUI.java:121
  • 好的,我看到你将这一行标记为评论!请检查更新的答案;-)

标签: java swing user-interface arraylist jframe


【解决方案1】:
ArrayList<Food> foodBase = new ArrayList<Food>();

您在构造函数中声明和初始化一个 local 变量,该变量恰好与 addFood() 方法中使用的字段同名。应该是

this.foodBase = new ArrayList<Food>();

编辑:再次阅读异常,您似乎也忘记在包含 Food 内部类 (TrackerGUI) 的类中初始化 tracker

【讨论】:

  • 我在更改它时收到“非法类型开始”错误。如果这些信息有帮助,我有一个单独的食物课。
  • 发布相关代码(即 Tracker 类,及其字段和构造函数),完整准确的错误消息,并告诉我们它指的是哪一行。请注意,再次阅读异常时,您似乎也忘记在包含 Food 内部类 (TrackerGUI) 的类中初始化跟踪器。
  • 我的public class TrackerGUI extends JFrame的开头有private Tracker tracker;
  • 这个跟踪器是空的,直到你初始化它。
【解决方案2】:

改变这个:

    else {
        tracker.addFood(newFood, calories); // this line!
        textArea.append(newFood + " with " + calories + " calories added to database! \n");
    }

到:

    else if (tracker != null){
        tracker.addFood(newFood, calories); // this line!
        textArea.append(newFood + " with " + calories + " calories added to database! \n");
    }

确保在 tracker 为 null 时不执行此代码并确保在此之前正确初始化了跟踪器:

 private Tracker tracker =  new Tracker(); // initialize your tracker!!

【讨论】:

  • 应该初始化跟踪器。如果 OP 忘记初始化它, if 块只会使问题更难诊断。 NullPointerException 比不执行任何操作且没有任何错误消息的 GUI 更易于诊断。
  • 我想我一直在看太多的声明,我完全忘记了如何初始化。感谢您指出!
  • @user3364528 没问题!它最终与这个初始化一起工作吗?
  • 我还没有打印出数组的内容,但是因为我的else 说“代码错误”(这样我就知道我是否做错了什么),而我的文本'我在我的else if 语句中附加了我的 textArea,我很确定它正在工作。再次感谢!
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多