Avatar billede chr.kj Nybegynder
02. december 2007 - 10:31 Der er 38 kommentarer og
1 løsning

Problem med serialisering og GUI

Hej.

Jeg er løbet ind i et problem med at hente data fra den fil jeg har dannet ved hjælp af serialisering og håber på at der er nogle af jer der kan fortælle mig hvad der er gået galt og hvad jeg kan gøre for at få det til at virke.

Jeg har denne kode i en Jbutton:

try{
            Kartotek mineFilm;
            mineFilm = (Kartotek) Serialisering.hent("Filmkartotek.ser");
            jTextArea1.setText( mineFilm.toString() );
           
        }  catch (Exception e) {
            jTextArea1.setText( "Ingen liste er tilgængelig");
            e.printStackTrace();
        }

Når jeg afvikler programmet og forsøger at hente data i filen Filmkartotek.ser får jeg denne fejl:

java.lang.ClassCastException: java.lang.Integer cannot be cast to dvdkartotek.Kartotek
at dvdkartotek.GrafiskMain.jButton2ActionPerformed(GrafiskMain.java:154)
        at dvdkartotek.GrafiskMain.access$100(GrafiskMain.java:16)
        at dvdkartotek.GrafiskMain$2.actionPerformed(GrafiskMain.java:80)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Hvad hulen betyder det? Er det fordi jeg forsøger at hente et objekt af typen integer ind i en string?

Skriv gerne hvad jeg kan gøre for at løse problemet, for jeg er simpelthen løbet ind i en mur her.
Skriv også gerne hvorfor det skal gøres som det nu skal, for det vil hjælpe mig meget :O)

På forhånd tak for hjælpen.
Avatar billede _carsten Nybegynder
02. december 2007 - 10:39 #1
Nej - det betyder du forsøger at caste en Integer til dvdkartotek.Kartotek

Svarer til at caste et æble til banan

Det sker sandsynligvis et eller andet sted i Serialisering.hent("Filmkartotek.ser");
Avatar billede _carsten Nybegynder
02. december 2007 - 10:41 #2
Start med at søge fejlen i GrafiskMain.java, linie 154, 16 og 80
Avatar billede chr.kj Nybegynder
02. december 2007 - 10:49 #3
Tak for svaret. Jeg er rimelig ny til Java og må derfor spørger lidt :o)

Caste.. Betyder det at jeg sammenligner eller forsøger at smide noget af typen Integer ind i et felt af en anden type?
Avatar billede chr.kj Nybegynder
02. december 2007 - 10:51 #4
linie 154 er: mineFilm = (Kartotek) Serialisering.hent("Filmkartotek.ser");
linie 16 er: public class GrafiskMain extends javax.swing.JFrame {
linie 80 er: public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
Avatar billede chr.kj Nybegynder
02. december 2007 - 10:53 #5
Min klasse Serialisering ser sådan ud i "hent":

public static Object hent( String filnavn ) throws Exception
    {
        FileInputStream datastrøm = new FileInputStream( filnavn );
        ObjectInputStream objektstrøm = new ObjectInputStream( datastrøm );
        Object obj = objektstrøm.readObject();
        objektstrøm.close();
        return obj;
Avatar billede _carsten Nybegynder
02. december 2007 - 11:10 #6
Det kan du godt sige

  Integer i = (Integer)obj;
  Referencen 'i' forventer at 'obj' er et object af typen Integer
  Er det ikke tilfældet får man en ClassCastException


Object obj = objektstrøm.readObject();
Er obj et object af typen Kartotek ???
Avatar billede chr.kj Nybegynder
02. december 2007 - 11:31 #7
Ja, jeg vil mene at obj refererer til objektet af typen Kartotek (min klasse kaldes Kartotek).
Avatar billede chr.kj Nybegynder
02. december 2007 - 11:38 #8
Jeg har helt glemt at nævne at de typer jeg forsøger at hente ind er:

int nummer
String titel
String genre
double spilletid

Det er disse typer der skal vises i feltet jTextArea1
Avatar billede _carsten Nybegynder
02. december 2007 - 11:40 #9
Ok - så må det jo være i Kartotek der sker et eller andet tosset

Jeg kan ikke lige pt se andet.
Avatar billede _carsten Nybegynder
02. december 2007 - 11:41 #10
Jeg kunne godt tænke mig at se metoden mineFilm.toString() og hele jButton2ActionPerformed(evt);
Avatar billede chr.kj Nybegynder
02. december 2007 - 11:44 #11
Min Kartoteks klasse ser sådan ud:

/*
* Kartotek.java
*
* Created on 28. november 2007, 19:31
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package dvdkartotek;

import java.util.ArrayList;

/**
*
* @author Administrator
*/
public class Kartotek {
   
    private String kartoteksNavn = " ";
    private ArrayList dvdFilm = null;
   
    /** Creates a new instance of Kartotek */
    public Kartotek() {
    }
   
    public Kartotek( String kartoteksNavn )
    {
        setKartoteksNavn( kartoteksNavn );
        dvdFilm = new ArrayList();
    }

    public String getKartoteksNavn() {
        return kartoteksNavn;
    }

    public void setKartoteksNavn(String kartoteksNavn) {
        this.kartoteksNavn = kartoteksNavn;
    }
   
    public ArrayList getDvdFilm()
    {
        return dvdFilm;
    }

    public void setDvdFilm(ArrayList dvdFilm) {
        this.dvdFilm = dvdFilm;
    }
   
    public void addFilm( Film film )
    {
        dvdFilm.add( film );
    }
   
    public String toString()
    {
        return "Navn på kartotek: " + kartoteksNavn + "\n\n" + dvdFilm.toString();
    }   
}

Som du kan se indeholder den ikke andet end navnet på mit DVD kartotek samt min ArrayListe. Kan det være fordi jeg ikke har importeret Serialiseringen i denne klasse?
Avatar billede chr.kj Nybegynder
02. december 2007 - 11:46 #12
Er det den du mener?:

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                       
// TODO add your handling code here:
        try{
            Kartotek mineFilm;
            mineFilm = (Kartotek) Serialisering.hent("Filmkartotek.ser");
            jTextArea1.setText( mineFilm.toString() );
           
        }  catch (Exception e) {
            jTextArea1.setText( "Ingen liste er tilgængelig");
            e.printStackTrace();
        }
    }
Avatar billede _carsten Nybegynder
02. december 2007 - 11:48 #13
Det ville være en god ide
public class Kartotek implements Serializable
Avatar billede _carsten Nybegynder
02. december 2007 - 11:49 #14
Ja, men implementer Serializable så sker der sikkert ting og sager
Avatar billede chr.kj Nybegynder
02. december 2007 - 11:58 #15
Øv.. Får stadig samme fejl selvom jeg har implements Serializable i mine klasser.
Avatar billede _carsten Nybegynder
02. december 2007 - 12:14 #16
Hvordan ser Film.java ud ?
Avatar billede chr.kj Nybegynder
02. december 2007 - 12:36 #17
Den ser sådan ud:

/*
* Film.java
*
* Created on 28. november 2007, 19:26
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package dvdkartotek;

import java.io.*;

/**
*
* @author Administrator
*/
public class Film implements Serializable {
   
    private int nummer = -1;
    private String titel = " ";
    private String genre = " ";
    private double spilletid = -1;
   
    /** Creates a new instance of Film */
    public Film() {
    }
   
    public Film( int nummer, String titel, String genre, double spilletid )
    {
        setNummer( nummer );
        setTitel( titel );
        setGenre( genre );
        setSpilletid( spilletid );
    }

    public int getNummer() {
        return nummer;
    }

    public void setNummer(int nummer) {
        this.nummer = nummer;
    }

    public String getTitel() {
        return titel;
    }

    public void setTitel(String titel) {
        this.titel = titel;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public double getSpilletid() {
        return spilletid;
    }

    public void setSpilletid(double spilletid) {
        this.spilletid = spilletid;
    }
   
    public String toString()
    {
        return "DVD nummer: " + nummer + "\nTitel: " + titel + "\nGenre: " + genre + "\nSpilletid: " + spilletid + "\n\n";
    }
   
}
Avatar billede _carsten Nybegynder
02. december 2007 - 12:51 #18
Hmm - det kan jeg ikke lige gennemskue !

Du har genstartet dit program efter implementering af Serializable ??
Avatar billede chr.kj Nybegynder
02. december 2007 - 12:59 #19
Jeg har compilet det og har haft mit program lukket ned, dog har jeg ikke haft lukket Netbeans ned efterfølgende.
Avatar billede chr.kj Nybegynder
02. december 2007 - 16:16 #20
Smider gerne nogle flere point ind hvis ikke det er nok.
Avatar billede _carsten Nybegynder
02. december 2007 - 16:39 #21
Ikke for min skyld.

Prøv at lave din hent() om til følgende

    public static Object hent( String filnavn ){
        Object obj = null;
        FileInputStream datastrøm = null;
        ObjectInputStream objektstrøm = null;

        try {
            datastrøm = new FileInputStream(filnavn);
        } catch (FileNotFoundException ex) {
            System.out.println("Filen blev ikke fundet: " + filnavn);
        }

        if(datastrøm != null){
            try {
                objektstrøm = new ObjectInputStream(datastrøm);
                obj = objektstrøm.readObject();
                objektstrøm.close();
            } catch (ClassNotFoundException ex) {
                System.out.println("ClassNotFoundException");
            } catch (IOException ex) {
                System.out.println("IO Exception");
            }
        }
        else
            System.out.println("datastrøm == null");
       
        return obj;
    }
Avatar billede arne_v Ekspert
02. december 2007 - 16:49 #22
Prøv evt. også:

                objektstrøm = new ObjectInputStream(datastrøm);
                obj = objektstrøm.readObject();
System.out.println("I read a " + obj.getClass().getName());
                objektstrøm.close();
Avatar billede chr.kj Nybegynder
02. december 2007 - 16:58 #23
Har lavet hent() om men den kommer stadig med samme fejl :(

init:
deps-jar:
Compiling 1 source file to C:\Documents and Settings\Administrator\Opgave4\build\classes
compile-single:
run-single:
Ingen liste er tilgængelig
java.lang.ClassCastException: java.lang.Integer cannot be cast to dvdkartotek.Kartotek
        at dvdkartotek.Main.main(Main.java:36)
BUILD SUCCESSFUL (total time: 0 seconds)

Nummer 36 i Main er :

mineFilm = (Kartotek) objektstrøm.readObject();

Hvad jeg kan se er det et eller andet galt i forbindelse med importen af ArrayListen.

mineFilm er det jeg har "døbt" min ArrayListe og Kartotek er min klasse.
Avatar billede _carsten Nybegynder
02. december 2007 - 17:03 #24
>>>mineFilm er det jeg har "døbt" min ArrayListe og Kartotek er min klasse.

Ikke forstået, i spm skriver du:  Kartotek mineFilm;

mener du nu: ArrayList mineFilm  ???
Avatar billede _carsten Nybegynder
02. december 2007 - 17:11 #25
try{
    Kartotek mineFilm;
    mineFilm = (Kartotek) Serialisering.hent("Filmkartotek.ser");
    jTextArea1.setText( mineFilm.toString() );

}  catch (Exception e) {
    jTextArea1.setText( "Ingen liste er tilgængelig");
    e.printStackTrace();
}

Skal virke hvis "Filmkartotek.ser" fysisk eksisterer
Avatar billede chr.kj Nybegynder
02. december 2007 - 17:17 #26
>> mener du nu: ArrayList mineFilm  ???

Nej.. Beklager.. Det er mig der er begyndt at rode rundt i det hele :/

Kartotek er klassen hvor jeg har min ArrayList (koden er længere oppe i denne tråd).
- Giver det overhovedet noget mening for dig?
Avatar billede _carsten Nybegynder
02. december 2007 - 17:24 #27
En anden ting der undrer mig er:

  Nummer 36 i Main er :

  >>> mineFilm = (Kartotek) objektstrøm.readObject();  ????
  Hvorfor kalder du ikke Serialisering.hent("Filmkartotek.ser"); ???????
Avatar billede chr.kj Nybegynder
02. december 2007 - 17:25 #28
FilmKartotek.ser eksisterer for jeg kan se den er dannet i min projekt mappe og når jeg åbner mit program og tilføjer film til min ArrayListe så skriver den skamp også fint nok til filen (kan se at ændretdato ændre sig når jeg tilføjer noget i min liste).

java.lang.ClassCastException: java.lang.Integer cannot be cast to dvdkartotek.Kartotek
        at dvdkartotek.Main.main(Main.java:36)

Det første der indlæses i min ArrayListe er:

int nummer og det første i min ArrayListe og det er vel der det går galt når den skal indlæses til mit jTextArea1

Er det fordi mine int og double skal konverteres til String inden de indlæses i mit felt??
Avatar billede chr.kj Nybegynder
02. december 2007 - 17:27 #29
arne_v

Hvis jeg indsætter denne kode i min hent() kommer der ikke en fejl ud med noget udover den sædvanlige..

init:
deps-jar:
Compiling 1 source file to C:\Documents and Settings\Administrator\Opgave4\build\classes
compile-single:
run-single:
Ingen liste er tilgængelig
java.lang.ClassCastException: java.lang.Integer cannot be cast to dvdkartotek.Kartotek
        at dvdkartotek.Main.main(Main.java:36)
BUILD SUCCESSFUL (total time: 0 seconds)
Avatar billede _carsten Nybegynder
02. december 2007 - 17:28 #30
Det bliver de i din toString()  "DVD nummer: " + nummer .......
Avatar billede chr.kj Nybegynder
02. december 2007 - 17:41 #31
Det er mere fordi jeg har arbejdet i mit GUI og ikke i main :)

Nu er koden i min main:

/*
* Main.java
*
* Created on 28. november 2007, 19:26
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package dvdkartotek;

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

/**
*
* @author Administrator
*/
public class Main implements Serializable {
   
    /** Creates a new instance of Main */
    public Main() {
    }
   
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) throws Exception
    { 
        Kartotek mineFilm = new Kartotek("mine film" );
        try {
            FileInputStream datastrøm = new FileInputStream( "FilmKartotek.ser" );
            ObjectInputStream objektstrøm = new ObjectInputStream( datastrøm );
           
            mineFilm = (Kartotek) Serialisering.hent("FilmKartotek.ser");
            System.out.println("Læst" + mineFilm );
           
            mineFilm = (Kartotek) Serialisering.hent("FilmKartotek.ser");
            System.out.println("Læst2" + mineFilm );
           
            objektstrøm.close();
        }  catch ( Exception e) {
            System.out.println( "Ingen liste er tilgængelig");
            e.printStackTrace();
        }
       
        System.out.println( mineFilm.toString() );
    }
   
}

og output ser sådan ud:

init:
deps-jar:
Compiling 1 source file to C:\Documents and Settings\Administrator\Opgave4\build\classes
compile-single:
run-single:
I read a java.lang.Integer
Ingen liste er tilgængelig
java.lang.ClassCastException: java.lang.Integer cannot be cast to dvdkartotek.Kartotek
        at dvdkartotek.Main.main(Main.java:36)
Navn på kartotek: mine film

[]
BUILD SUCCESSFUL (total time: 0 seconds)

Nummer 36 er stadig:

mineFilm = (Kartotek) Serialisering.hent("FilmKartotek.ser");
Avatar billede chr.kj Nybegynder
02. december 2007 - 17:58 #32
Kan det være fordi første felt i filen FilmKartotek.ser er en int og i min Kartoteks klasse beder jeg at få hentet kartoteksNavn først og herefter min dvdFilm.toString()

public String toString()
    {       
        return "Navn på kartotek: " + kartoteksNavn + "\n\n" + dvdFilm.toString();
    }
Avatar billede chr.kj Nybegynder
02. december 2007 - 17:58 #33
kartoteksNavn er en String og ikke en int.
Avatar billede _carsten Nybegynder
02. december 2007 - 18:32 #34
Nej - det fortæller os at FilmKartotek.ser ikke indeholder det du tror, den læser en Integer, hvordan gemmer/skriver du filen
Avatar billede chr.kj Nybegynder
02. december 2007 - 21:53 #35
Klassen hvor jeg skriver og gemmer filen hedder Serealisering og koden ser sådan ud:

/*
* Serialisering.java
*
* Created on 28. november 2007, 19:52
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package dvdkartotek;

/**
*
* @author Administrator
*/
import java.io.*;

public class Serialisering implements Serializable {
   
    /** Creates a new instance of Serialisering */
    public static void gem( Object obj, String filnavn ) throws IOException
    {
        FileOutputStream datastrøm = new FileOutputStream( filnavn );
        ObjectOutputStream objektstrøm = new ObjectOutputStream( datastrøm );
        objektstrøm.writeObject( obj );
        objektstrøm.close();
    }
    public static Object hent( String filnavn ){
        Object obj = null;
        FileInputStream datastrøm = null;
        ObjectInputStream objektstrøm = null;

        try {
            datastrøm = new FileInputStream(filnavn);
        } catch (FileNotFoundException ex) {
            System.out.println("Filen blev ikke fundet: " + filnavn);
        }

        if(datastrøm != null){
            try {
                objektstrøm = new ObjectInputStream(datastrøm);
                obj = objektstrøm.readObject();
                System.out.println("I read a " + obj.getClass().getName());
                objektstrøm.close();
            } catch (ClassNotFoundException ex) {
                System.out.println("ClassNotFoundException");
            } catch (IOException ex) {
                System.out.println("IO Exception");
            }
        }
        else
            System.out.println("datastrøm == null");
       
        return obj;
    }   
}

I min GUI klasse har jeg denne kode som danner filen og tilføjer til min ArrayListe:

try {
         
          FileInputStream datastrøm = new FileInputStream( "FilmKartotek.ser" );
          ObjectInputStream objektstrøm = new ObjectInputStream( datastrøm );
         
          mineFilm = (Kartotek) objektstrøm.readObject();
          jTextArea1.setText( mineFilm.toString() );
         
          objektstrøm.close();
           
      }      catch ( Exception e ) {
                Film film = new Film( nummer, titel, genre, spilletid );
                mineFilm.addFilm( film );
            FileOutputStream datastrøm = null;
            try {
                datastrøm = new FileOutputStream("FilmKartotek.ser");
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            }
            ObjectOutputStream objektstrøm = null;
            try {
                objektstrøm = new ObjectOutputStream(datastrøm);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            try {
                               
                objektstrøm.reset();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            try {
                objektstrøm.writeObject( 1 );
            } catch (IOException ex) {
                ex.printStackTrace();
            }
                jTextArea1.setText( mineFilm.toString() );
            try {
               
                objektstrøm.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
           
            }
Avatar billede chr.kj Nybegynder
02. december 2007 - 21:54 #36
Glemte lige det øverste i min GUI kode for knappen...

String kartoteksNavn = jTextField2.getText();
        int nummer = Integer.parseInt( jTextField1.getText() );
        String titel = jTextField3.getText();
        String genre = (String) jComboBox1.getSelectedItem();
        double spilletid = Double.parseDouble( jTextField4.getText() );       
       
       
        if( mineFilm == null )
            mineFilm = new Kartotek( kartoteksNavn );
Avatar billede chr.kj Nybegynder
03. december 2007 - 14:39 #37
Fik løst det :o)

Skrev koden om i min hent og fik rettet den for fejl og nu virker det.

            Serialisering.gem( mineFilm, "Dvd.ser" );

Det var, som du nævnte, i min gem funktion at der var fejl og efter jeg rettede film til mineFilm virkede det.

Jeg vil gerne give dig point hvis du lægger et svar for du fik mig på rette vej og med den hjælp fortjæner du helt klart alle pointene :o)

Smider du et svar?
Avatar billede chr.kj Nybegynder
05. december 2007 - 10:14 #38
Smider du et svar carsten?
Avatar billede _carsten Nybegynder
05. december 2007 - 20:51 #39
Ja - kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester