2017-12-02 15 views
0

質問と呼ばれる質問オブジェクトの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

完全にシンプルです。あなたは文字列をシリアライズし、それを質問として逆シリアル化しようとしました。実際にファイルを生成するために実際に実行されたコードではありません。これは、このコードが空の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のは、することはできません質問 にキャストします。あなたがStringでClassCastExceptionを取得している可能性が最も高いので、質問にSerializableインターフェイスもありません。このような何か:

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

あなたは空のボックスを持っていることを想像:

class Question implements Serializable { 
    String text; 

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

が動作するコードを追加します。あなたは箱にリンゴを入れます。

次に、それを閉じて後で開きます。さて、あなたは、その箱にハンバーガーを見つけることが期待できると思いますか?

しかし、それはあなたがやっていることです - 文字列を格納し、質問オブジェクトを見つけることを期待しています。例外的なクラスキャストは、あなたの前提条件に合わない現実について、JVMがあなたにどのように伝えているかです。

解決策:質問オブジェクトを格納するか、ファイルを読むときに文字列が返ってくることを期待してください。

+0

右。だから、あなたが言っていることは、オブジェクトをArrayListに格納するたびに、それがStringとして格納されるということですか?ファイルからオブジェクトを読み込んだとき、文字列として格納されているので、それらをQuestionオブジェクトとして読み取ることはできません。 – HaiHey

+0

@HaiHeyいいえ、彼はちょうどあなたが読もうとしたものとは違ったものを保管していると言っていました。ストリングとして何かを保存した唯一の人物は、あなたが実際のコードでまだ提供していなかったあなたでした。 – EJP

+0

@HaiHeyいいえ。私が言っているのは、**あなたが**りんごを箱に入れたら、あなたは*りんごを箱に入れます**。あなたのコードは、あなたがすることを指示します。 Stringオブジェクトを格納します。質問オブジェクトではありません。 – GhostCat

0

これは私が言ったのとまったく同じです。

oos.writeObject(questions.toString()); 

をそして、それは決してなかったQuestion、としてそれをデシリアライズしようとする:あなたはString直列化され

(Question)in.readObject(); 

ソリューション:

  • .toString()一部を削除します。
  • List<Question>としてデシリアライズします。これが実際の動作です。
+0

私はそれを試してみます。ありがとうございました。 – HaiHey

+0

あなたは何をしたのですか? – EJP

関連する問題