使用 ObjectInputStream 的 ClassNotFoundException
ClassNotFoundException using ObjectInputStream
我有一个 class 实现可序列化
package lligafutbolserial.aaron.gomez;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Scanner;
public class Equip implements Comparable<Equip>, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
transient Integer puntsLliga;
transient String nomEquip;
HashMap<Integer, Jugador> jugadors;
transient Scanner in;
public Equip(String nom) {
this.nomEquip = nom;
this.puntsLliga = 0;
this.jugadors = new HashMap();
}
public HashMap<Integer, Jugador> getJugadors() {
return jugadors;
}
public void setJugadors(HashMap<Integer, Jugador> jugadors) {
this.jugadors = jugadors;
}
public String getNom() {
return nomEquip;
}
public int getPunts() {
return puntsLliga;
}
public void incrementaPunts(int punts) {
puntsLliga += punts;
}
@Override
public String toString() {
return "Equip: puntsLliga=" + puntsLliga + ", nomEquip=" + nomEquip;
}
@Override
public int compareTo(Equip o) {
// TODO Auto-generated method stub
return o.puntsLliga.compareTo(this.puntsLliga);
}
public HashMap<Integer, Jugador> afegirJugadors() {
in = new Scanner(System.in);
do {
if (jugadors.size() > 0) {
in.nextLine();
}
Jugador jugador = new Jugador();
System.out.println("Nom del jugador: ");
jugador.setNom(in.nextLine());
System.out.println("Cognom del jugador: ");
jugador.setCognom(in.nextLine());
System.out.println("Dorsal del jugador: ");
jugador.setDorsal(in.nextInt());
System.out.println("Edat del jugador: ");
jugador.setEdat(in.nextInt());
System.out.println("Dona'm l'al�ada del jugador: ");
jugador.setAlsada(in.nextFloat());
jugador.setGols(0);
jugador.setEquip(this);
jugadors.put(jugador.getDorsal(), jugador);
} while (jugadors.size() < 15);
return jugadors;
}
public boolean afegirUnJugador() {
in = new Scanner(System.in);
Jugador jugador = new Jugador();
System.out.println("Nom del jugador: ");
jugador.setNom(in.nextLine());
System.out.println("Cognom del jugador: ");
jugador.setCognom(in.nextLine());
System.out.println("Dorsal del jugador: ");
jugador.setDorsal(in.nextInt());
System.out.println("Edat del jugador: ");
jugador.setEdat(in.nextInt());
System.out.println("Dona'm l'al�ada del jugador: ");
jugador.setAlsada(in.nextFloat());
jugador.setGols(0);
jugador.setEquip(this);
if (jugadors.put(jugador.getDorsal(), jugador) == null) {
return true;
} else {
return false;
}
}
}
我用下一个方法写入文件:
public void escriureTot() throws IOException{
String nomFitxer = "";
for(Equip e : equips){
System.out.println(e.getNom());
nomFitxer = "LligaBBVA/"+ e.getNom();
writerTot = new ObjectOutputStream(new FileOutputStream(nomFitxer));
writerTot.writeObject(e);
writerTot.close();
}
}
我使用这个循环获取文件名并从文件中读取。
for (Path fitxers : ds) {
System.out.println(fitxers.toString());
System.out.println(fitxers.toString().substring(10));
String nomEquip = fitxers.toString().substring(10);
ObjectInputStream llegir = new ObjectInputStream(new FileInputStream("LligaBBVA/" + nomEquip));
equip = (Equip) llegir.readObject();
equips.add(equip);
llegir.close();
}
但是当我尝试 equip = (Equip) llegir.readObject();出现此错误:
Exception in thread "main" java.lang.ClassNotFoundException: lligafutbol.aaron.gomez.Equip
at java.net.URLClassLoader.run(URLClassLoader.java:372)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at lligafutbolserial.aaron.gomez.Lliga.<init>(Lliga.java:51)
at lligafutbolserial.aaron.gomez.Principal.main(Principal.java:14)
我已经尽力做到最清楚了,如果难以理解,请见谅。感谢 m8!
您的代码有
package lligafutbolserial.aaron.gomez;
//...
public class Equip
错误消息说:
ClassNotFoundException: lligafutbol.aaron.gomez.Equip
显然您序列化了另一个 class 装备在另一个包 lligafutbol
中的对象。您必须使用相同的 classes.
您似乎在写入(至少其中一个)文件和尝试读回它们之间更改了包名称。您提供 class lligafutbolserial.aaron.gomez.Equip
的代码,但 Java 试图读取的对象 class 是 lligafutbol.aaron.gomez.Equip
("lligafutbolserial" 与 "lligafutbol").
另请注意,您似乎以一种奇怪的方式命名——并且可能是在安排——你的包裹。由于包名称由编译器映射到目录树,因此通常将段从最一般到最具体排序是最方便的。即gomez.aaron.lligafutbolserial
。基本上 所有 Java 代码都是这样命名和排列的。
我有一个 class 实现可序列化
package lligafutbolserial.aaron.gomez;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Scanner;
public class Equip implements Comparable<Equip>, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
transient Integer puntsLliga;
transient String nomEquip;
HashMap<Integer, Jugador> jugadors;
transient Scanner in;
public Equip(String nom) {
this.nomEquip = nom;
this.puntsLliga = 0;
this.jugadors = new HashMap();
}
public HashMap<Integer, Jugador> getJugadors() {
return jugadors;
}
public void setJugadors(HashMap<Integer, Jugador> jugadors) {
this.jugadors = jugadors;
}
public String getNom() {
return nomEquip;
}
public int getPunts() {
return puntsLliga;
}
public void incrementaPunts(int punts) {
puntsLliga += punts;
}
@Override
public String toString() {
return "Equip: puntsLliga=" + puntsLliga + ", nomEquip=" + nomEquip;
}
@Override
public int compareTo(Equip o) {
// TODO Auto-generated method stub
return o.puntsLliga.compareTo(this.puntsLliga);
}
public HashMap<Integer, Jugador> afegirJugadors() {
in = new Scanner(System.in);
do {
if (jugadors.size() > 0) {
in.nextLine();
}
Jugador jugador = new Jugador();
System.out.println("Nom del jugador: ");
jugador.setNom(in.nextLine());
System.out.println("Cognom del jugador: ");
jugador.setCognom(in.nextLine());
System.out.println("Dorsal del jugador: ");
jugador.setDorsal(in.nextInt());
System.out.println("Edat del jugador: ");
jugador.setEdat(in.nextInt());
System.out.println("Dona'm l'al�ada del jugador: ");
jugador.setAlsada(in.nextFloat());
jugador.setGols(0);
jugador.setEquip(this);
jugadors.put(jugador.getDorsal(), jugador);
} while (jugadors.size() < 15);
return jugadors;
}
public boolean afegirUnJugador() {
in = new Scanner(System.in);
Jugador jugador = new Jugador();
System.out.println("Nom del jugador: ");
jugador.setNom(in.nextLine());
System.out.println("Cognom del jugador: ");
jugador.setCognom(in.nextLine());
System.out.println("Dorsal del jugador: ");
jugador.setDorsal(in.nextInt());
System.out.println("Edat del jugador: ");
jugador.setEdat(in.nextInt());
System.out.println("Dona'm l'al�ada del jugador: ");
jugador.setAlsada(in.nextFloat());
jugador.setGols(0);
jugador.setEquip(this);
if (jugadors.put(jugador.getDorsal(), jugador) == null) {
return true;
} else {
return false;
}
}
}
我用下一个方法写入文件:
public void escriureTot() throws IOException{
String nomFitxer = "";
for(Equip e : equips){
System.out.println(e.getNom());
nomFitxer = "LligaBBVA/"+ e.getNom();
writerTot = new ObjectOutputStream(new FileOutputStream(nomFitxer));
writerTot.writeObject(e);
writerTot.close();
}
}
我使用这个循环获取文件名并从文件中读取。
for (Path fitxers : ds) {
System.out.println(fitxers.toString());
System.out.println(fitxers.toString().substring(10));
String nomEquip = fitxers.toString().substring(10);
ObjectInputStream llegir = new ObjectInputStream(new FileInputStream("LligaBBVA/" + nomEquip));
equip = (Equip) llegir.readObject();
equips.add(equip);
llegir.close();
}
但是当我尝试 equip = (Equip) llegir.readObject();出现此错误:
Exception in thread "main" java.lang.ClassNotFoundException: lligafutbol.aaron.gomez.Equip
at java.net.URLClassLoader.run(URLClassLoader.java:372)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at lligafutbolserial.aaron.gomez.Lliga.<init>(Lliga.java:51)
at lligafutbolserial.aaron.gomez.Principal.main(Principal.java:14)
我已经尽力做到最清楚了,如果难以理解,请见谅。感谢 m8!
您的代码有
package lligafutbolserial.aaron.gomez;
//...
public class Equip
错误消息说:
ClassNotFoundException: lligafutbol.aaron.gomez.Equip
显然您序列化了另一个 class 装备在另一个包 lligafutbol
中的对象。您必须使用相同的 classes.
您似乎在写入(至少其中一个)文件和尝试读回它们之间更改了包名称。您提供 class lligafutbolserial.aaron.gomez.Equip
的代码,但 Java 试图读取的对象 class 是 lligafutbol.aaron.gomez.Equip
("lligafutbolserial" 与 "lligafutbol").
另请注意,您似乎以一种奇怪的方式命名——并且可能是在安排——你的包裹。由于包名称由编译器映射到目录树,因此通常将段从最一般到最具体排序是最方便的。即gomez.aaron.lligafutbolserial
。基本上 所有 Java 代码都是这样命名和排列的。