反序列化二进制类文件的内容时ClassNotFoundException

Gab*_*lli 5 java class file loader deserialization

我对Java知之甚少.我正在尝试读取一个包含int的文件和一个名为"Automobile"的类的各种实例.但是,当我反序列化它时,程序抛出一个ClassNotFoundException,我似乎无法理解为什么.

这是代码:

        try {
        FileInputStream fin = new FileInputStream(inputFile);
        ObjectInputStream input = new ObjectInputStream(fin);

        conto = input.readInt();

        Automobile[] macchine = new Automobile[conto];

        for(int i = 0; i < conto; i++) {
            macchine[i] = (Automobile)input.readObject();
        }

        String targa;
        System.out.print("\nInserire le cifre di una targa per rintracciare l'automobile: ");
        targa = sc1.nextLine();

        for(int i = 0; i < conto; i++) {
            if(macchine[i].getTarga().equals(targa))
                System.out.println(macchine[i]);
        }

    } catch(IOException e) {
        System.out.println("Errore nella lettura del file "+inputFile);
    } catch(java.lang.ClassNotFoundException e) {
        System.out.println("Class not found");
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢.

编辑:这是堆栈跟踪

java.lang.ClassNotFoundException: es4.Automobile
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at es4p2.Main.main(Main.java:35)
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 9

反序列化序列化对象树时,所有对象的类必须位于类路径上.在这种情况下,ClassNotFoundException很可能意味着所需的类之一不在类路径上.您必须解决此问题才能使反序列化工作.

在这种情况下,es4.Automobile缺少.


这个问题可能是由我所做的自定义异常导致的吗?

我能想到的唯一其他可能性是:

  • es4.Automobile 直接或间接依赖于其他一些缺失的类
  • 静态初始化es4.Automobile或依赖类抛出了一个未在类内部捕获的异常.

但是这两者都应该(我认为)导致了不同的堆栈跟踪.


我刚注意到包名是es4p2,而不是es4.为什么说es4?可能是因为保存文件的程序使用另一个包名?

我不知道他们为什么会有所不同.您需要与编写代码/生成序列化对象的人交谈.但是,这很可能是导致问题的原因.具有不同包名称的类是不同的类.期.


捕获意外异常时,应始终输出(或更好地,记录)堆栈跟踪.这将告诉你(和我们)更多关于出错的地方,在这种情况下,缺少类的名称.

  • “处于类路径中”类是什么意思?文件Automobile.java与Main.java在同一程序包中,这会引发异常。 (2认同)