2015-03-03 2 views
0

У меня есть класс, который реализует сериализации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(); 
    } 

Но когда я попробую equip = (Equip) 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's!

+0

Похоже, проект, в котором вы читаете данные, не имеет этого класса Equip. –

+0

- это классы «Principal» и «Equip» в одном пакете? Если нет, вы импортировали 'Equip'? –

+0

, если ваш класс 'lligafutbol.aaron.gomez.Equip' внутри JAR, обязательно добавьте его в класс-путь' Principal'. Как именно вы вызываете свой код? – Arkantos

ответ

1

Возможно, вы изменили имена пакетов между письмом (по крайней мере одним из) файлов и попыткой их прочитать. Вы представляете код для класса lligafutbolserial.aaron.gomez.Equip, но класс объекта Java, который пытается прочитать, это lligafutbol.aaron.gomez.Equip («lligafutbolserial» vs. «lligafutbol»).

Обратите также внимание на то, что вы, кажется, называете - и предположительно организуете - ваши пакеты странным образом. Поскольку имена пакетов сопоставляются с деревом каталогов компилятором, обычно наиболее удобно упорядочить сегменты от большинства общих до наиболее конкретных. То есть, gomez.aaron.lligafutbolserial. По существу все Java-код назван и устроен таким образом.

+0

Да, это то, что я на самом деле сделал, но как я могу изменить класс Equip что я хочу выбрать? Coz я не хочу lligafutbol.aaron.gomez.Equip больше, я хочу lligafutbolserial.aaron.gomez.Equip. Большое спасибо! – xinp4chi

+0

исправьте свой оператор 'import' в классе' Principal', если вы хотите использовать тот же пакет, просто удалите явный импорт для 'lligafutbol.aaron.gomez.Equip' – Arkantos

+0

Они на самом деле все в одном пакете, но ошибка все равно выйдет. Мне жаль, никогда не бывает этого раньше ... Я имею в виду, я проверил импорт и пакет, все в одном пакете. – xinp4chi

0

Ваш код имеет

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

сообщение об ошибке говорит:

ClassNotFoundException: lligafutbol.aaron.gomez.Equip 

Видимо вы сериализовать объект другого класса Equip в другом пакете lligafutbol. Вы должны использовать одинаковые классы.

Смежные вопросы