0

Я пытаюсь прочитать сериализованные данные из файла .dat в соответствующий файл класса java. Однако мой метод .readObject() продолжает бросать ClassNotFoundException. Почему они не могут прочитать данные из файла? Я пытаюсь прочитать его в классе ученика, который конструктор принимает объекты своего типа, а затем присваивает значения переменных этого объекта своим переменным.Проблемы с чтением объектов из двоичного файла в Java

public class StudentTest 
{ 
    private static ObjectInputStream OIS; 
    public static void main(String[] args) 
    { 

     openFile(); 
     readFile(); 
     closeFile(); 
    } 

    public static void openFile() 
    { 
     try 
     { 
      OIS=new ObjectInputStream(Files.newInputStream(Paths.get("C:\\Users\\Joey\\Desktop\\students.dat"))); 
     } 
     catch(IOException e) 
     { 
      System.out.println("Error trying to read file. TERMINATING."); 
      System.exit(1); 
     } 
    } 

    public static void readFile() 
    { 
     try 
     { 
      while(true) 
      { 
       Student student=new Student((Student)OIS.readObject()); 
       System.out.printf("%s", student.toString()); 
      } 
     } 
     catch(ClassNotFoundException e) 
     { 
      System.out.println("Class not found. Terminating."); 
      System.exit(1); 
     } 
     catch(EOFException e) 
     { 
      System.out.println("End of file reached."); 
     } 
     catch(IOException e) 
     { 
      System.out.println("Error reading from file. TERMINATING."); 
      System.exit(1); 
     } 
    } 

    public static void closeFile() 
    { 
     try 
     { 
      if(OIS!=null) 
       OIS.close(); 
     } 
     catch(IOException e) 
     { 
      System.out.println("IOEXCEPTION."); 
      System.exit(1); 
     } 
    } 
} 

Вот трассировки стека:

java.lang.ClassNotFoundException: files.Student 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at java.io.ObjectInputStream.resolveClass(Unknown Source) 
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) 
at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
at java.io.ObjectInputStream.readObject0(Unknown Source) 
at java.io.ObjectInputStream.readObject(Unknown Source) 
at studentfiles.StudentTest.readFile(StudentTest.java:40) 
at studentfiles.StudentTest.main(StudentTest.java:16) 
+0

Вы сериализовали 'Student' в файл' students.dat', используя тот же класс 'Student', включая имя пакета? Пожалуйста, разместите трассировку стека исключений. – dasblinkenlight

+0

Я загрузил файл .dat от своего учителя, и я создал свой собственный пакет для хранения файла Student.java (который я также загрузил у своего учителя) и этого файла. – ComicalGamer

+0

StudentTest [Java приложения] \t \t <отсоединен> studentfiles.StudentTest на локальном хосте: 52452 \t \t <прекращено, выход значение: 1> C: \ Program Files \ Java \ jre1.8.0_31 \ Bin \ javaw.exe (Sep 16, 2015, 7:40:59 PM) \t Является ли это трассировкой стека исключений? – ComicalGamer

ответ

1

Ваш Student класс находится в другом пакете от того, что, как ожидается. Если вы печатаете сообщение об исключении, которое появилось с ClassNotFoundException, вы увидите, что ожидаемый пакет был.

И ошибка при создании ObjectInputStream или FileInputStream не обязательно является «ошибкой чтения из файла». Не составляйте свои собственные сообщения об ошибках. Используйте ту, которая поставляется с исключением. Даже если у вас есть правильное сообщение, как и у ClassNotFoundException, вам не хватает фактического имени класса, которое не было найдено, которое было в сообщении об исключении. Не делай этого.

+0

Спасибо за ваше право. Я не должен использовать свои собственные сообщения об ошибках. Особенно, когда я просто делаю ерунду lol – ComicalGamer

+0

Итак, в верхней части трассировки стека говорится «files.Student». Это где он думает, что мой класс учеников? В моем проекте у меня есть класс Student в пакете «studentfiles». – ComicalGamer

+0

Правильно, это должно быть в 'files.' – EJP

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