使用ObjectInputStream的ClassNotFoundException

时间:2015-03-03 15:51:58

标签: java classnotfoundexception objectinputstream

我有一个实现可序列化的类

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();
    }

但是当我尝试装备=(装备)llegir.readObject();出现此错误:

Exception in thread "main" java.lang.ClassNotFoundException: lligafutbol.aaron.gomez.Equip
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.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)

我努力做到最清楚,对不起,如果难以理解的话。 Thx m8&#39; s。

2 个答案:

答案 0 :(得分:1)

您似乎在写入(至少一个)文件并尝试读取它们之间更改了包名称。您提供了类lligafutbolserial.aaron.gomez.Equip的代码,但Java试图读取的对象的类是lligafutbol.aaron.gomez.Equip(“lligafutbolserial”与“lligafutbol”)。

另请注意,您似乎是以奇怪的方式命名 - 并且可能是安排 - 您的包裹。由于程序包名称由编译器映射到目录树,因此通常最方便的是从最常规到最具体的顺序排序。也就是gomez.aaron.lligafutbolserial。基本上所有 Java代码都以这种方式命名和排列。

答案 1 :(得分:0)

您的代码已

package lligafutbolserial.aaron.gomez;
//...
public class Equip

错误消息显示:

ClassNotFoundException: lligafutbol.aaron.gomez.Equip

显然你序列化了另一个类的对象装备另一个包lligafutbol。你必须使用相同的类。

相关问题