2017-12-02 20 views
0

질문이라는 Question 객체의 ArrayList를 파일에 쓰려고하고 파일을 읽으려고합니다. java.lang.ClassCastException가 :파일에서 객체 읽기 ClassCastException 오류

내 문제는 내가 파일을 읽고있다 할 때, 그것은 나에게 말한다 오류를 준다이다 java.lang.String의이

Quiz.load에서 질문에 캐스트 할 수없는 내 질문은, 왜이 문제가 발생하고 어떻게 해결할 수 있습니까? 나는 많은 튜토리얼을 읽었으며 클래스 이름으로 객체를 캐스팅했다. 내 저장 &로드 기능을 포함 시켰습니다.

내부 퀴즈 클래스 :

쓰기 개체가 파일

ArrayList<Question> readQuestions = new ArrayList<>(); 
    FileInputStream fis = new FileInputStream(filename); 
    ObjectInputStream ois = new ObjectInputStream(fis); 

    System.out.print("QUIZ LOADING..."); 

    readQuestions.add((Question)ois.readObject()); //problem occurs 
+1

완벽하게 간단합니다. 당신은 문자열을 직렬화하고 그것을 질문으로 역 직렬화하려고했습니다. 분명히 이것은 파일을 생성하기 위해 실제로 실행 된 코드가 아닙니다. 이것은,이 코드가 빈 상태 (empty)의 ArrayList를 직렬화하는 것 외에는 아무것도 실시하지 않는 것에 의해 추가로 증명됩니다. 당신의 코드가 ArrayList를 직렬화하지만 질문으로 역 직렬화하려고한다는 사실에 의해 * 더 입증됩니다. 그것은 이해가되지 않습니다. 실제 코드를 게시하는 것이 좋습니다. – EJP

+0

안녕하세요 EJP, 감사합니다. 코드를 게시합니다. 나는 GUI를 가지고 있기 때문에 그것을 수정할 것이고 너무 길다. – HaiHey

+0

@EJP이 최근의 것을 의미합니까? 전에 게시 한 스캐너 및 가져 오기가 없으므로 방금 추가했습니다. 전체 코드에는 GUI가 있으며 NetBeans의 드래그 앤 드롭을 사용하여 코드를 자동 생성하므로 매우 오래되었습니다. 이 현재 코드는 터미널에서 컴파일/실행될 수 있으며 여전히 ClassCastException을 보여줍니다. – HaiHey

답변

0

당신은 목록을 직렬화 및 질문과 직렬화를 해제하는에서

ArrayList<Question> questions = new ArrayList<>(); 
    //filename given by user 
    FileOutputStream fos = new FileOutputStream(filename); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 

    oos.writeObject(questions); 

읽기 개체 파일입니다.

그냥이

readQuestions = (ArrayList<Question>) ois.readObject();

또한 설명과 함께

readQuestions.add((Question) ois.readObject()); //problem occurs

을 변경 java.lang.ClassCastException가 : 나는이 오류를 가지고 예를했을 때 가 인 java.util.ArrayList가 될 수 없다 질문 캐스팅 그래서 당신은 문자열로 ClassCastException을 얻는다면, 당신은 또한 질문에 Serializable 인터페이스가 누락되었습니다. 이런 식으로 뭔가 :

class Question implements Serializable { 
    String text; 

    public Question(String text) { 
     this.text = text; 
    } 
} 

추가 작업 코드 :

import java.io.*; 
import java.util.ArrayList; 

public class ObjectIS { 
    public static void main(String[] args) { 
     new ObjectIS().save(); 
     new ObjectIS().load("abcd"); 
    } 

    public void save() { 
     try { 
      ArrayList<Question> questions = new ArrayList<>(); 
      questions.add(new Question("what is your name")); 
      //filename given by user 
      FileOutputStream fos = new FileOutputStream("abcd"); 
      ObjectOutputStream oos = new ObjectOutputStream(fos); 

      oos.writeObject(questions); 

      oos.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void load(String filename) { 
     try { 
      ArrayList<Question> readQuestions = new ArrayList<>(); 
      FileInputStream fis = new FileInputStream(filename); 
      ObjectInputStream ois = new ObjectInputStream(fis); 

      System.out.print("QUIZ LOADING..."); 

//   readQuestions.add((Question) ois.readObject()); //problem occurs 
      readQuestions = (ArrayList<Question>) ois.readObject(); 
      System.out.println("ois = " + readQuestions); 
      ois.close(); 
      fis.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassCastException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

class Question implements Serializable { 
    String text; 

    public Question(String text) { 
     this.text = text; 
    } 

    @Override 
    public String toString() { 
     final StringBuffer sb = new StringBuffer("Question{"); 
     sb.append("text='").append(text).append('\''); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 
+0

수정되었지만보고 된 실제 예외는 설명하지 않습니다. – EJP

+0

나는 이것을 시도해 보았고 새로운 에러가 발생했다 : 경고 : [체크되지 않은] 체크되지 않은 캐스트 readQuestions = (ArrayList ) ois.readObject(); 필수 : ​​ArrayList 발견됨 : 경고 1 – HaiHey

+0

@EJP 설명과 함께 편집 되었습니까? – mdev

0

는 빈 상자를 가지고 상상해보십시오. 상자에 사과를 넣으십시오.

그런 다음 닫은 다음 나중에 엽니 다. 이제, 그 상자에 햄버거를 찾을 수있을 것이라고 생각합니까?

하지만 그게 당신이하는 일입니다. 문자열을 저장하고 Question 객체를 찾으려고합니다. 예외적 인 클래스 캐스팅은 jvm이 가정에 맞지 않는 현실에 대해 알려주는 방식입니다.

해결 방법 : 질문 개체를 저장하거나 파일을 읽을 때 문자열이 다시 올 것으로 예상하십시오.

+0

오른쪽. 그래서 당신이 말하는 것은 ArrayList에 객체를 저장할 때마다 그 객체가 String으로 저장된다는 것입니다. 파일에서 객체를 읽을 때 String으로 저장 되었기 때문에 Question 객체로 읽을 수 없습니다. – HaiHey

+0

@HaiHey 아니요, 그는 방금 읽으려고했던 것과 다른 것을 저장했다고했습니다. String으로 저장 한 유일한 사람은 실제 코드에서 제공하지 않은 것입니다. – EJP

+0

@HaiHey 아니요. 내가 말하는 것은 : ** 상자에 사과를 넣어 사과 상자에 넣을 때입니다. 코드는 사용자가 수행 할 작업을 수행합니다. String 객체를 저장합니다. 질문 객체가 아닙니다. – GhostCat

0

정확하게 말했듯이.

oos.writeObject(questions.toString()); 

을 그리고 그것이 결코 Question로 직렬화 복원을 시도 : 당신은 String serialising된다

(Question)in.readObject(); 

솔루션 :

  • .toString() 부분을 제거합니다.
  • List<Question>으로 역 직렬화합니다. 이것이 실제로 될 것입니다.
+0

알겠습니다. 고맙습니다. – HaiHey

+0

그랬을 때 무슨 일이 일어 났습니까? – EJP