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

Java 反序列化二进制文件时出现堆栈溢出错误,java,deserialization,binaryfiles,Java,Deserialization,Binaryfiles,所以我试图将信息保存到一个对象数组列表中,但一切正常,每当我尝试加载以前保存的数组列表时,我都会收到一个堆栈溢出错误 我猜我需要某种计数器,但是,我不太熟悉java和反序列化程序的工作原理。我已经附上我的代码如下-任何帮助将不胜感激 ArrayList<Car> cars = new ArrayList<Car>(); public void addCar { System.out.println("What is the make of the car?")

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

我猜我需要某种计数器,但是,我不太熟悉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();
        }
    }
编辑2 这是汽车级别

public Car(String year, String odometer, String make, String model)
    {
        this.make = make; 
        this.model = model; 
        this.year = year; 
        this.odometer = odometer; 
    }
下面是Netbeans正在抛出的错误

线程“main”java.lang.StackOverflowerr中出现异常 位于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) 在pkg300000969carsarraylist.Car.(Car.java:29) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46) 在pkg300000969carsarraylist.Car.(Car.java:46)

你需要看电视

确定了代码中的以下问题

  • 由于您正在序列化Car数据,Car类应该实现
    Serializable
    接口
  • 公共类汽车实现可序列化{
    私人字符串制作;
    私有字符串模型;
    私人弦年;
    专用弦式里程表;
    公共汽车(){}
    公共汽车(串年、串里程表、串品牌、串型号)
    {
    make=make;
    this.model=模型;
    今年=年;
    这个。里程表=里程表;
    }
    }
    
  • 由于您正在将汽车列表添加到文件中,在反序列化它时,它将是汽车列表而不是汽车,因此使用汽车进行强制转换将失败 更改
    cars=(Car)in.readObject()

    .readObject()中的
    ArrayList cars=(ArrayList)

  • 构造函数参数的顺序不正确
    公共汽车(字符串年份、字符串里程表、字符串品牌、字符串型号)

    vs
    cars.add(新车(新品牌、新车型、新年份、新里程计))
    因此,您的映射将是
    新建-->年份,
    新型号-->里程表,
    新年-->制作,
    新里程计-->型号

  • 因此,最后的工作代码是

    
    导入java.io.FileInputStream;
    导入java.io.FileOutputStream;
    导入java.io.IOException;
    导入java.io.ObjectInputStream;
    导入java.io.ObjectOutputStream;
    导入java.util.ArrayList;
    导入java.util.Scanner;
    导入java.util.logging.Level;
    导入java.util.logging.Logger;
    公共类JavaBinaryFile{
    静态ArrayList cars=新ArrayList();
    公共静态void main(字符串[]args){
    addCar();
    saveFile();
    openFile();
    }
    公共静态void addCar(){
    扫描仪扫描=新扫描仪(System.in);
    System.out.println(“这辆车是什么牌子的?”);
    字符串newMake=scan.next();
    System.out.println(“汽车的型号是什么?”);
    字符串newModel=scan.next();
    System.out.println(“这辆车是哪一年生产的?”);
    字符串newYear=scan.next();
    System.out.println(“这辆车走了多远?”);
    字符串newOdometer=scan.next();
    添加(新车(新品牌、新车型、新年份、新里程计));
    }
    公共静态void openFile(){
    试一试{
    FileInputStream fileIn=newfileinputstream(“testSave.plzwork”);
    ObjectInputStream in=新的ObjectInputStream(fileIn);
    试一试{
    ArrayList cars=(ArrayList)在.readObject()中;
    }捕获(ClassNotFoundException ex){
    Logger.getLogger(Car.class.getName()).log(Level.SEVERE,null,ex);
    }
    in.close();
    fileIn.close();
    }捕获(IOI异常){
    i、 printStackTrace();
    }
    }
    公共静态void保存文件(){
    试一试{
    FileOutputStream fileOut=新的FileOutputStream(“testSave.plzwork”);
    ObjectOutputStream out=新的ObjectOutputStream(fileOut);
    out.writeObject(汽车);
    out.close();
    fileOut.close();
    System.out.println(“保存序列化数据”);
    }捕获(IOI异常){
    i、 printStackTrace();
    }
    }
    }
    
    反序列化文件直接取决于“在该文件中序列化的方式和内容”。所以,为了判断您为什么会遇到这种异常,我需要您的序列化代码。请让我知道你是如何序列化数组列表的。你能分享Car类的代码吗你能分享
    Car
    类的代码吗?还指示
    Car.java
    的第29行和第46行?
    public Car(String year, String odometer, String make, String model)
        {
            this.make = make; 
            this.model = model; 
            this.year = year; 
            this.odometer = odometer; 
        }