Ошибка в 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 шт):
Вот тут:
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();
}
Тогда список просто останется пустым. Плюс ко всему эексепшены стунт более явно читаться в логах.