2010-03-11 2 views
3
public static Reservation[] openBinaryFile(String fileName) 
{ 
    Reservation [] objArray = null; 

    try 
    { 
     ObjectInputStream inStream = new ObjectInputStream(
      new FileInputStream(fileName)); 

     objArray = (Reservation[])inStream.readObject(); 

     inStream.close(); 
    } 
    catch(ClassNotFoundException e) 
    { 
     System.out.println("Exception: ClassNotFoundException."); 
    } 

У меня есть класс, но почему я получаю исключение? Класс находится в том же пакете, что и другие. Почему я получаю это исключение?Java - ClassNotFoundException У меня есть класс, но почему я получаю исключение?

EDIT: Вот трассировки стека пробег: java.lang.ClassNotFoundException: Бронирование в java.net.URLClassLoader $ 1.Run (URLClassLoader.java:200) на java.security.AccessController.doPrivileged (Native Метод) at java.net.URLClassLoader.findClass (URLClassLoader.java:188) в java.lang.ClassLoader.loadClass (ClassLoader.java:307) at sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java: 301) на java.lang.ClassLoader.loadClass (ClassLoader.java:252) на java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320) на java.lang.Class.forName0 (Native Meth od) at java.lang.Class.forName (Class.java:247) at java.io.ObjectInputStream.resolveClass (ObjectInputStream.java:604) at java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1575) на java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1496) в java.io.ObjectInputStream.readArray (ObjectInputStream.java:1624) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1323) на java.io.ObjectInputStream.readObject (ObjectInputStream.java:351) на myViewer.DatabaseFile.openBinaryFile (DatabaseFile.java:42) на myViewer.Viewer. (Viewer.java:175) на myViewer.Viewer.main (просмотрщик .java: 188)

+1

В вашей статье catch отбрасывается вся важная информация, а именно WHICH CLASS не найдена, и какое утверждение вызвало исключение. Попробуйте распечатать трассировку стека и опубликуйте результат. –

+0

Что-то не так в этом примере. Если JVM не знает, что такое «Резервация», она не пройдет мимо объявления массива. – danben

+2

В настоящее время вы не распечатываете содержимое исключения, а это значит, что вы действительно не знаете, какой класс не найден. Возможно, это зависит от сериализованного файла. В общем, когда вы поймаете исключение и запишите его, вы должны * всегда * распечатывать сообщение об исключении. –

ответ

0

две вещи:

  • Убедитесь, что вы на самом деле читаете Reservation[]
    • Если вы читаете подтип Reservation (например VIPReservation), то вам необходимо в двоичном для этого типа
  • Удостоверьтесь, что это точная версия Reservation

Немедленное действенные:

  • Диагностика трассировки стека.

Глядя на трассировку стека, он ожидает, что Reservation будет находиться в пакете в по умолчанию. Убедитесь, что это так.

+0

Первый дал бы «ClassCastException», а не «ClassNotFoundException». – BalusC

+0

Но он, возможно, читал 'VIPReservation []', для которого у него нет двоичного кода, верно? – polygenelubricants

+1

Да, действительная точка :) – BalusC

0

Файл класса, о котором идет речь, не такой же, как файл класса, из которого экземпляр был первоначально сериализован. Выровняйте его или дайте им одинаковые serialVersionUID.

0

Что именно дает вам исключение? e.printStackTrace() расскажет вам. Может быть, вы не import java.io.ObjectInputStream?

+2

Это дало бы ошибку компиляции, а не исключение во время выполнения. – BalusC

+0

Хороший вопрос, пропустил это :) – jackbot

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