06. oktober 2002 - 18:26Der er
34 kommentarer og 1 løsning
persistens virker ikke
jeg har følgende problem persistens virker ikke i dette program, en Jlist i CdVies klassen opdateres i konstuktøren
public CdView() { initComponents(); setEnabled(); //getController(); //getController().load(); opdaterListe(getController().getModel().getCdContainer());
}
resten af koden er her på CdView
import java.util.Vector; /* * CdView.java * * Created on 3. oktober 2002, 22:56 */
/** * * @author unknown */ public class CdView extends javax.swing.JFrame {
/** Creates new form CdView */ public CdView() { initComponents(); setEnabled(); //getController(); //getController().load(); opdaterListe(getController().getModel().getCdContainer());
}
/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() { jPanel1 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); jList1 = new javax.swing.JList(); jPanel2 = new javax.swing.JPanel(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton();
import java.util.*; /* * CdController.java * * Created on 6. oktober 2002, 15:44 */
/** * * @author unknown */ public class CdController { private Model model; private MyCd cd; /** Creates a new instance of Controller */
public void addCd(MyCd cd) { getModel().addToCdItems(cd); CdView.opdaterListe(getModel().getCdContainer()); } public Model getModel() { model = Model.getModel();
return model; } public void save() { getModel().writeModel(); } public void load() { getModel(); }
public Vector getAllcd() { return getModel().getCdContainer();
public Model getModel(){ model = Model.getModel(); return model; } Har du en statisk getModel-metode på Model-klassen? Hvorfor lave private Model model-referencen, når du ikke bruger den?
import java.io.*; import java.util.*; /* * Model.java * * Created on 6. oktober 2002, 15:37 */
/** * * @author unknown */ public class Model implements java.io.Serializable{ private static CdContainer c = new CdContainer(); private static Model model; private static final String FILSTI = "c:\\model.dat"; /** Creates a new instance of Model */ public Model() { //c = new CdContainer(); } public static void addToCdItems(MyCd cd) { c.add(cd); } public static void removeCd(MyCd cd) { c.remove(cd); }
public static Model getModel() { if (model == null) { model = (Model) read(); if(model == null) model = new Model(); } return model; }
public static Vector getCdContainer() { return c.getAllElements(); }
public static void write(Object o) { File f = new File(FILSTI); try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(f)); os.writeObject(o); os.close(); } catch(Exception e) { System.out.println("fejl i write"); } }//end write
public static Object read() {
File f = new File(FILSTI); Object res = null; try { ObjectInputStream os = new ObjectInputStream(new FileInputStream(f)); res = os.readObject(); os.close(); //return res;
} catch(Exception e) { System.out.println("fejl i read"); }
Prøv at skrive e.printStackTrace() i din catch sætninger istedet for System.out.... så får du en liste ud med fejl! Og så skiv lige hvilke fej lder kommer ud!
Din retur værdi i class Model returnere et objekt det kan du bare bruge, hvis det er en Vector/Container det returnere. Hus kat typecaste objektet! Brug den med følgende opdaterListe((CdController)getController().getModel().read());
får denne fejl når model.dat er slettet ellers når model.dat er oprettet er der ingen fejl An unexpected exception has been detected in native code outside the VM. Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x6D066E76 Function=[Unknown.] Library=(N/A) NOTE: We are unable to locate the function name symbol for the error just occurred. Please refer to release documentation for possible reason and solutions. Current Java thread: at sun.awt.windows.WToolkit.eventLoop(Native Method) at sun.awt.windows.WToolkit.run(WToolkit.java:240) at java.lang.Thread.run(Thread.java:536) Dynamic libraries: 0x72A00000 - 0x72A2D000 C:\WINDOWS\SYSTEM\DBGHELP.DLL Local Time = Sun Oct 06 20:19:48 2002 Elapsed Time = 1 # # The exception above was detected in native code outside the VM # # Java VM: Java HotSpot(TM) Client VM (1.4.0-b92 mixed mode) # # An error report file has been saved as hs_err_pid4294760471.log. # Please refer to the file for further information. #
Hmm, har du prøvet med System.out... at skrive Objektet ud du læser fra filen og derefter skrive det ud efterfølgende der hvor du bruger det for at lokalisere problemet ?
Så vidt jeg kan se så er problemet følgende: Når du opretter en cd så add'er du til en ny controller hver gang og når du så gemmer gemmer du en tom controller uden de cd du har oprettet ! Enten skal du lave en metode hvor du kan hente den fælles controller og derefter add'e til den og så gemme den. Ellers skal du sende controllere med hver gang du opretter en ny Opret.
Er der en grund til at du har alle de klasser det nemmeste ville være at have to Gui klasser (start, opret), en CdController og og en dataklasse MyCD ? Det kan hurtig laves istedet for alle de forvirende klasser!
Ja det er rigtigt at jeg har en del klasser, men det er ikke uoverskueligt"for mig", og dog :(, dvs det er den måde vi skal lave på. Med en model der gemmer data, samt har en statisk vector til at lægge cd'er ned i, skulle man jo ikke kunne lægge cd'er ned i en "forkert" vector. Ang controlleren, så opretter man kun en kontroller en gang, den bliver oprettet igen og igen når man bruger opret klassen, er det har du kan se problemet, har testet write og read af uden for programmet og fik ikke fejl med her ?
public CdController getController() { if(controller == null) return new CdController return controller }
Nej, men jeg fik som sagt den til at opdatere JList med koden fra før, problemet er bare at den åbentbart ikke gemmer den rigtige controller, du kan f.eks. ogs teste på hvad der er i controlleren inden den gemmes i filen, hvsi den er tom er det der problemet ligger :-)
Jeg har kontroller dine klasser lidt og er kommet frem til følgende: når du bruger write(Object o) på Model er o null, hvilket den ikke burde være! Derefter tjekkede jeg om Model overhoved bliver skrevet i og Ja jeg to size ud af dine CdContainere og de viser det korekte antal. Så et eller andet sted derimellem :-) er der et brud på din kode, hvor den er og hvad der er kan jeg ikke lige se, og det er også nok nemmere for dig idet du har kodet det :-)
Således laver du en metode, som gemmer et objekt binært til en fil:
import java.io.*;
public static void write(Object o, String filename) { try { File outFile = new File(filename); FileOutputStream outFileStream = new FileOutputStream(outFile); ObjectOutputStream outObjectStream = new ObjectOutputStream(outFileStream); outObjectStream.writeObject(o); outObjectStream.close(); } catch (IOException e) { o = null; } }
Husk at det objekt 'o' du gemmer, skal implementere java.io.Serializable. Ditto alle objekter som dit objekt 'o' har referernce til (der så også bliver gemt).
Her er metoden til at indlæse filen til et objekt:
public static Object read(String filename) { Object o; try { File inFile = new File(filenamen); FileInputStream inFileStream = new FileInputStream(inFile); ObjectInputStream inObjectStream = new ObjectInputStream(inFileStream); o = inObjectStream.readObject(); inObjectStream.close(); } catch (Exception exc) { o = null; } return o; }
og hvor er forskellen på det du kommer med, iforhold til det her public static void write(Object o) { File f = new File(FILSTI); try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)); oos.writeObject(o); oos.close(); } catch(Exception e) { e.printStackTrace(); } }//end write
public static Object read() {
File f = new File(FILSTI); //Object res = new Object(); try { ObjectInputStream oos = new ObjectInputStream(new FileInputStream(f)); Object o = oos.readObject(); oos.close(); return o;
Jeg gav bare det rigtige svar, og så var jeg fri for at skulle kigge din kilometerlange kode igennem, hvor mestedelen ikke har noget med sagen at gøre...
Hvis koden er som jeg har skrevet og det ikke virker og Serializable er implementeret de rigtige steder, er det IKKE koden der er noget galt med.
Nu kan jeg se du nævner EXCEPTION_ACCESS_VIOLATION. Det er en exception der bliver smidt i Windows fra selve din JVM. Det er ikke noget du er herre over eller kan gøre noget som helst ved. Det eneste du kan gøre er at skifte til en JVM du ved er stabil. Du bruger en 1.4-beta ser jeg. Prøv i stedet 1.4.0_01 som er den sidste stabile eller 1.3. Hvis ikke det hjælper må du leve med problemet eller dit program om.
Jeg vil faktisk anbefale, at du deler brugergrænseflade og model op i flere klasser. LAD VÆRE med at gemme et objekt der indeholder brugergrænseflade. Gem kun databærende objekter. Jeg ved ikke hvor meget du ved, men som datamatiker har jeg lært at dele tingene kraftigt op. Problemet kan ligge i at du blander tingene sammen.
Til axe2's forsvar kan jeg sige at koden er delt RIGELIGT op, det er overhoved ikke blandet, det ville du se hvis du havde kigget det "kilometerlange kode" igennem :-) For det andet så gemmer han kun databærende objekter og ikke brugergrænseflade, det er bare fordi den klasse han gemmer kalder han Model, det er nok der det forvirre!
du gentager jo bare en del af koden, der er skrevet engang, desuden hvis du ikke gider at læse kilometer af kode, who cares, så lad da vær, jeg opfatter ikke dit svar som værende tilstrækkeligt.
Hvorfor er i så aggresive, hvis ikke axe2 er tilfreds med svaret så er det bare fint med mig. Jeg prøver bare hurtigt at komme med nogle ideer, og har de allerede været oppe at vende så ignorer dem da bare og afvis svaret. Det handler da ikke om at skulle forsvare og skælde ud...
Desuden nævnte jeg noget om den fejl du får: EXCEPTION_ACCESS_VIOLATION
Er det den fejl du får hver gang eller hvordan ser fejlen helt præcist ud?
får denne fejl hvis jeg prøver at indlæse modellen
java.io.InvalidClassException: Model; local class incompatible: stream classdesc serialVersionUID = 8950065083596849906, local class serialVersionUID = -6690419920701049063 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:454) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1511) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1425) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1616) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1264) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:322) at Model.read(Model.java:68) at Model.getModel(Model.java:34) at CdView.<init>(CdView.java:25) at CdView.main(CdView.java:117)
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.