反序列化二进制文件时发生堆栈溢出错误

因此,我试图将信息保存到对象数组列表中,但是一切正常,但是,每当我尝试加载以前保存的数组列表时,我都会收到堆栈溢出错误。

我猜我需要某种计数器,但是,我不熟悉Java以及反序列化器的工作方式。我已经在下面附加了我的代码-任何帮助将不胜感激。

ArrayList<Car> cars = new ArrayList<Car>();

public void addCar
{
     System.out.println("What is the make of the car?");
     String newMake = scan.next();
     System.out.println("What is the model of the car?");
     String newModel = scan.next();
     System.out.println("What year was the car produced?");
     String newYear = scan.next();
     System.out.println("How far has this car traveled?");
     String newOdometer = scan.next();
     cars.add(new Car(newMake,newModel,newYear,newOdometer));   
}

public void openFile()
    {
        Car cars = new Car();
      try {
         FileInputStream fileIn = new FileInputStream("testSave.plzwork");
         ObjectInputStream in = new ObjectInputStream(fileIn);
            try {
                cars = (Car)in.readObject();
            } catch (ClassnotFoundException ex) {
                Logger.getLogger(carClass.class.getName()).log(Level.SEVERE,null,ex);
            }
         in.close();
         fileIn.close();
        }
        catch (IOException i) {
         i.printStackTrace();
        }
    }

编辑 这是序列化代码

public void saveFile()
    { 
        try 
        {
            FileOutputStream fileOut = new FileOutputStream("testSave.plzwork");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(cars);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved");
        } 
        catch (IOException i) {
        i.printStackTrace();
      }
    }

编辑2 这是汽车课

public Car(String year,String odometer,String make,String model)
    {
        this.make = make; 
        this.model = model; 
        this.year = year; 
        this.odometer = odometer; 
    }

这是Netbeans吐出来的错误

  

线程“主”中的异常java.lang.StackOverflowError       在java.base / java.lang.AbstractStringBuilder.setLength(AbstractStringBuilder.java:277)       在java.base / java.lang.StringBuffer.setLength(StringBuffer.java:233)       在java.base / java.text.DecimalFormat.expandAffix(DecimalFormat.java:2978)       在java.base / java.text.DecimalFormat.expandAffixes(DecimalFormat.java:2946)       在java.base / java.text.DecimalFormat.applyPattern(DecimalFormat.java:3632)       在java.base / java.text.DecimalFormat。(DecimalFormat.java:466)       在java.base / sun.util.locale.provider.NumberFormatProviderImpl.getInstance(NumberFormatProviderImpl.java:187)       在java.base / sun.util.locale.provider.NumberFormatProviderImpl.getNumberInstance(NumberFormatProviderImpl.java:151)       在java.base / java.text.NumberFormat.getInstance(NumberFormat.java:969)       在java.base / java.text.NumberFormat.getInstance(NumberFormat.java:953)       在java.base / java.text.NumberFormat.getNumberInstance(NumberFormat.java:518)       在java.base / java.util.Scanner.useLocale(Scanner.java:1270)       在java.base / java.util.Scanner。(Scanner.java:543)       在java.base / java.util.Scanner。(Scanner.java:566)       在pkg30000969carsarraylist.Car。(Car.java:29)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)       在pkg30000969carsarraylist.Car。(Car.java:46)

mff123456789 回答:反序列化二进制文件时发生堆栈溢出错误

您需要查看basics of serialization and deserialization

确定您的代码存在以下问题。

  1. 自序列化Car数据以来,Car类应实现Serializable接口
public class Car implements Serializable {

    private String make;
    private String model;
    private String year;
    private String odometer;

    public Car(){}

    public Car(String year,String odometer,String make,String model)
    {
        this.make = make;
        this.model = model;
        this.year = year;
        this.odometer = odometer;
    }
}
  1. 由于要将汽车列表添加到文件中,而在反序列化时,它将是汽车列表而不是汽车,因此使用汽车进行投射将失败 变化
    cars = (Car)in.readObject();

    ArrayList<Car> cars = (ArrayList<Car>) in.readObject();

  2. 构造函数参数乱序 public Car(String year,String model)
    vs
    cars.add(new Car(newMake,newModel,newYear,newOdometer)); 这样您的映射将是
    newMake->年,
    newModel->里程表,
    newYear-> make,
    newOdometer->模型

所以最后可以使用的代码是


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JavaBinaryFile {

    static ArrayList<Car> cars = new ArrayList<>();

    public static void main(String[] args) {
        addCar();
        saveFile();
        openFile();
    }

    public static void addCar() {
        Scanner scan = new Scanner(System.in);

        System.out.println("What is the make of the car?");
        String newMake = scan.next();
        System.out.println("What is the model of the car?");
        String newModel = scan.next();
        System.out.println("What year was the car produced?");
        String newYear = scan.next();
        System.out.println("How far has this car traveled?");
        String newOdometer = scan.next();
        cars.add(new Car(newMake,newOdometer));
    }

    public static void openFile() {
        try {
            FileInputStream fileIn = new FileInputStream("testSave.plzwork");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            try {
                ArrayList<Car> cars = (ArrayList<Car>) in.readObject();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Car.class.getName()).log(Level.SEVERE,null,ex);
            }
            in.close();
            fileIn.close();
        } catch (IOException i) {
            i.printStackTrace();
        }
    }

    public static void saveFile() {
        try {
            FileOutputStream fileOut = new FileOutputStream("testSave.plzwork");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(cars);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}


本文链接:https://www.f2er.com/3168650.html

大家都在问