Ошибка в Java проекте

Подскажите пожалуйста в чем может быть ошибка, при нажатии на форме на кнопку "View product list" не выводит значения, хотя должно выводить массив с параметрами товара. Ошибка в IDE при нажатии кнопки такова: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "java.util.ArrayList.iterator()" because "stocks" is null. Но в файл записывается информация, но не выводит Очень нужна помощь!!!!

Код файла Stock класса сток для хранения параметров товара:

package com.company;
import java.io.Serializable;
class Stock implements Serializable {
    private int warehouseNumber;
    private String productName;
    private double price;
    private int count;
    private String availability;

    public Stock(int warehouseNumber, String productName, double price, int count, String availability) {
        this.warehouseNumber = warehouseNumber;
        this.productName = productName;
        this.price = price;
        this.count = count;
        this.availability = availability;
    }

    public void setWarehouseNumber(int warehouseNumber) {
        this.warehouseNumber = warehouseNumber;
    }

    public void setProductName(String productName) {

        this.productName = productName;
    }

    public void setPrice(double price) {

        this.price = price;
    }

    public void setCount(int count) {

        this.count = count;
    }

    public void setAvailability(String availability) {

        this.availability = availability;
    }

    public int getWarehouseNumber() {

        return warehouseNumber;
    }

    public String getProductName() {

        return productName;
    }

    public double getPrice() {

        return price;
    }

    public int getCount() {

        return count;
    }

    public String getAvailability() {
        return availability;
    }

    @Override
    public String toString() {
        return "Warehouse number: " + this.warehouseNumber + ". Product name: " + this.productName + ". Price: " + this.price + ". Count: " + this.count + ". Availability of goods in stock" + this.availability;
    }
}

Код файла Main:

package com.company;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Formatter;

public class Main extends Frame {

    public static void main(String[] args) {
        Frame mainWindow = new Main();
        mainWindow.setTitle("Variant #1, Dudchenko Yaroslav, Group IT92-0/2");
        mainWindow.setVisible(true);
        mainWindow.setLayout(null);
        mainWindow.setResizable(false);

        mainWindow.setSize(1000, 600);
        mainWindow.setLocation(400, 200);

        Frame addFrame = new addGoodsWindow();
        Frame deleteFrame = new deleteGoodsWindow();
        Frame changeFrame = new changeGoodsWindow();

        Button changeGoods = new Button("Change");
        changeGoods.setBounds(150, 40, 140, 50);
        mainWindow.add(changeGoods);

        changeGoods.addActionListener(arg0 -> changeFrame.setVisible(true));

        Button deleteGoods = new Button("Delete");
        deleteGoods.setBounds(290, 40, 140, 50);
        mainWindow.add(deleteGoods);

        deleteGoods.addActionListener(arg0 -> deleteFrame.setVisible(true));

        Button addGood = new Button("Add");
        addGood.setBounds(10, 40, 140, 50);
        mainWindow.add(addGood);

        TextArea outputWindow = new TextArea();
        outputWindow.setBounds(10, 90, 980, 500);
        mainWindow.add(outputWindow);

        outputWindow.setEditable(false);

        addGood.addActionListener(arg0 -> addFrame.setVisible(true));

        Button showGoods = new Button("View product list");
        showGoods.setBounds(430, 40, 140, 50);
        mainWindow.add(showGoods);

        showGoods.addMouseListener(new MouseAdapter() {
            Dialog dialog;
            // Вывод списка продуктов
            @Override
            public void mouseClicked(MouseEvent e) {
                ArrayList<Stock> stocks = null;
                try {
                    stocks = readFromFile();
                } catch (IOException ioException) {
                    System.out.println(ioException);
                }
                outputWindow.append("Product list:\n");
                int i = 1;
                for (Stock Stock :
                        stocks) {
                    outputWindow.append(i + ". " +  Stock.toString() + "\n");
                    i++;
                }
            }
            //Считывание с файла
            public ArrayList<Stock> readFromFile() throws IOException {
                Dialog dialog;

                ArrayList<Stock> stocks = new ArrayList<>();
                try {
                    FileInputStream fileInputStream = new FileInputStream("database.txt");
                    ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
                    Stock object;

                    try {
                        while ((object = (Stock) objectInputStream.readObject()) != null) {

                            stocks.add(object);
                        }
                    } catch (EOFException | ClassNotFoundException e) {
                    }
                    fileInputStream.close();
                    objectInputStream.close();

                    return stocks;
                } catch (FileNotFoundException e) {
                    JOptionPane.showMessageDialog(mainWindow, "File not found");
                }
                return stocks;
            }
        });
        // Очистка екрана
        Button clearTextarea = new Button("Clear window");
        clearTextarea.setBounds(870, 40, 120, 50);
        mainWindow.add(clearTextarea);

        clearTextarea.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                outputWindow.setText("");
            }
        });
        //Сохранение в файл
        Button saveSearch = new Button("Save data");
        saveSearch.setBounds(570, 40, 160, 50);
        mainWindow.add(saveSearch);

        saveSearch.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                File file = new File("savesearch.txt");
                Formatter formatter = null;
                try {
                    formatter = new Formatter(file);
                    formatter.format(outputWindow.getText() + "\n");
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                } finally {
                    formatter.close();
                }

            }
        });






        mainWindow.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

Код файла добавления товара в файл:

package com.company;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class addGoodsWindow extends Frame {
    public addGoodsWindow() throws HeadlessException {

        String mainTitle = "Add goods";
        Frame thisWindow = this;
        setTitle(mainTitle);
        setSize(300, 460);
        setLocation(800, 360);
        setVisible(false);
        setLayout(null);
        setResizable(false);

        Label warehouseNumber = new Label("Warehouse number (required)");
        warehouseNumber.setBounds(65, 30, 180, 30);
        add(warehouseNumber);

        TextField warehouseNumberInput = new TextField(1);
        warehouseNumberInput.setBounds(10, 60, 280, 30);
        add(warehouseNumberInput);

        Label productName = new Label("Name of good (required)");
        productName.setBounds(65, 100, 180, 30);
        add(productName);

        TextField productNameInput = new TextField(1);
        productNameInput.setBounds(10, 130, 280, 30);
        add(productNameInput);

        Label price = new Label("The price of the product (required)");
        price.setBounds(65, 170, 180, 30);
        add(price);

        TextField priceInput = new TextField(1);
        priceInput.setBounds(10, 200, 280, 30);
        add(priceInput);

        Label count = new Label("Quantity of goods in stock (required)");
        count.setBounds(65, 240, 200, 30);
        add(count);

        TextField countInput = new TextField(1);
        countInput.setBounds(10, 270, 280, 30);
        add(countInput);

        Label availability = new Label("Availability (required)");
        availability.setBounds(90, 310, 140, 30);
        add(availability);

        CheckboxGroup availabilityInput = new CheckboxGroup();
        Checkbox availabilityInput1 = new Checkbox("In stock", availabilityInput, false);
        availabilityInput1.setBounds(70, 340, 60, 40);
        Checkbox availabilityInput2 = new Checkbox("Not availability", availabilityInput, false);
        availabilityInput2.setBounds(150, 340, 90, 40);
        add(availabilityInput1);
        add(availabilityInput2);

        Button buttonAddGoods = new Button("Add");
        buttonAddGoods.setBounds(80, 380,140, 50);
        add(buttonAddGoods);

        buttonAddGoods.addMouseListener(new MouseAdapter()  {
            @Override
            public void mouseClicked(MouseEvent e) {

                Dialog dialog;
                Checkbox checkbox = availabilityInput.getSelectedCheckbox();
                try {
                    if (warehouseNumberInput.getText().length() != 0) {
                        if (productNameInput.getText().length() != 0) {
                            if (priceInput.getText().length() != 0) {
                                if (countInput.getText().length() != 0) {
                                    if (checkbox != null) {
                                        int warehouseNumber = Integer.parseInt(warehouseNumberInput.getText());
                                        String productName = productNameInput.getText();
                                        double price = Double.parseDouble(priceInput.getText());
                                        int count = Integer.parseInt(countInput.getText());
                                        String availability = checkbox.getLabel();

                                        Stock obj = new Stock(warehouseNumber, productName, price, count, availability);
                                        try {
                                            File file = new File("database.txt");
                                            FileOutputStream fileOutputStream;
                                            ObjectOutputStream objectOutputStream;

                                            if (file.exists()) {
                                                fileOutputStream = new FileOutputStream(file, true);
                                                objectOutputStream = new resetHeaderFile(fileOutputStream);
                                            } else {
                                                fileOutputStream = new FileOutputStream(file);
                                                objectOutputStream = new ObjectOutputStream(fileOutputStream);
                                            }
                                            objectOutputStream.writeObject(obj);
                                            objectOutputStream.close();
                                            fileOutputStream.close();
                                        } catch (IOException exception) {
                                        }

                                        warehouseNumberInput.setText("");
                                        productNameInput.setText("");
                                        priceInput.setText("");
                                        countInput.setText("");
                                        JOptionPane.showMessageDialog(thisWindow, "Add is success!");
                                    } else {
                                        JOptionPane.showMessageDialog(thisWindow, "Please, check availability!");
                                    }
                                } else {
                                    JOptionPane.showMessageDialog(thisWindow, "Please, enter count (integer value)!");
                                }
                            } else {
                                JOptionPane.showMessageDialog(thisWindow, "Please, enter price!");
                            }
                        } else {
                            JOptionPane.showMessageDialog(thisWindow, "Please, enter product name!");
                        }
                    } else {
                        JOptionPane.showMessageDialog(thisWindow, "Please, enter warehouse number!");
                    }
                } catch (NumberFormatException exception) {
                    JOptionPane.showMessageDialog(thisWindow, "Type error!");
                }
            }
        });

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                setVisible(false);
            }
        });
    }
}

Ответы (1 шт):

Автор решения: Alexey R.

Вот тут:

ArrayList<Stock> stocks = null;
try {
    stocks = readFromFile();
} catch (IOException ioException) {
    System.out.println(ioException);
}

скорее всего вываливается эксепшен и лист остается неинициализированным.

Это единственно возможная причина, потому что метод readFromFile может либо вернуть не наловую ссылку, либо выкинуть ексепшен.

В качестве решения могу предложить поменять код на:

List<Stock> stocks = new ArrayList<>();
try {
    stocks = readFromFile();
} catch (IOException ioException) {
    ioException.printStackTrace();
}

Тогда список просто останется пустым. Плюс ко всему эексепшены стунт более явно читаться в логах.

→ Ссылка