从BinaryI/O读取ArrayList遇类型转换错误,求解决办法
解决Binary I/O读取ArrayList时类型转换错误问题
问题原因
报错明确说明你从Administrators.dat中读取到的对象是Boolean类型,而非预期的ArrayList<Administrator>。大概率是之前向该文件写入数据时,误写入了Boolean值(比如output.writeObject(true)),或是写入的对象根本不是完整的ArrayList<Administrator>实例。
解决方案
1. 检查并修正写入文件的代码
确保写入Administrators.dat的确实是ArrayList<Administrator>对象,示例正确写入代码如下:
public void writeAdmin() { try { ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("Administrators.dat")); ArrayList<Administrator> admins = usercontroller.getAdmins(); output.writeObject(admins); // 确认此处写入的是ArrayList对象 output.close(); } catch (IOException e) { e.printStackTrace(); } }
2. 处理错误的文件内容
当前文件中存储的是无效的Boolean对象,直接读取会报错。可以手动删除该文件,或者在读取代码中增加类型校验逻辑,避免崩溃并重置数据:
public void readAdmin(){ try{ File file = new File("Administrators.dat"); // 若文件为空(刚创建),直接初始化空列表 if (file.length() == 0) { usercontroller.setAdmins(new ArrayList<>()); return; } ObjectInputStream input = new ObjectInputStream(new FileInputStream("Administrators.dat")); Object obj = input.readObject(); // 先判断类型再转换,避免强制转换报错 if (obj instanceof ArrayList) { ArrayList<Administrator> adms = (ArrayList<Administrator>) obj; usercontroller.setAdmins(adms); } else { usercontroller.setAdmins(new ArrayList<>()); System.out.println("文件内容类型错误,已重置管理员列表"); } input.close(); } catch(IOException e){ System.out.println("Input of administrator data error."); e.printStackTrace(); } catch (ClassNotFoundException cn){ System.out.println("Administrator class not existent."); cn.printStackTrace(); } }
3. 确保Administrator类实现Serializable接口
虽然当前报错不是这个原因,但要保证ArrayList<Administrator>能正常序列化/反序列化,Administrator类必须实现Serializable接口:
import java.io.Serializable; public class Administrator implements Serializable { // 类成员与方法 }
内容的提问来源于stack exchange,提问作者Abbs
相关产品推荐
相关产品推荐

