Avatar billede ehdaniel Nybegynder
19. december 2003 - 12:21 Der er 20 kommentarer

Desperation! Hvor er fejlen i min kode?

Hold godt fast for her poster jeg kode! Jeg har et problem med at få mit program til at køre ordentligt. Min mail ligger i JournalGUI, som åbner med en fejl i konsollen der hedder java.io.StreamCorruptedException: unexpected EOF in middle of data block. Dog åbner den og man kan benytte søgefeltet. Men normalt (og det HAR virket, jeg ved bare ikke hvad jeg ændrede) skal JournalGUI så åbne næste GUI, der hedder KlientJournalGUI, men der kommer der en fejl i linie 68 i Controller-klassen (Iterator it = jl.iterator();)og i linie 36 i JournalGUI(Vector v = cont.soegEfter(soegeFelt.getText());). Jeg er bare en ÅND til det her og jeg har revet mig i hårrødderne hele dagen. Er der ikek nok en god sjæl der kan kigge det igennem? Måske er problemet noget med min liste, som jeg opretter gennem min testklasse. Jeg har prøvet at gemme to forskellige personer så der ligger mere end eet objekt i den serialiserede fil på disken. Måske er det noget med at jeg opretter en instans af Controller for meget? Jeg ved det ikke...
MVH Elisabeth

CONTROLLER-KLASSEN:

import java.io.*;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;

/**
* @author ehdaniel
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class Controller {
    private JournalObjekt journal;
    private JournalListe jl, hentListe;
    private ObjectInputStream in;
private ObjectOutputStream out;
private FileInputStream ois;
    public Controller(){
    journal = new JournalObjekt();

    jl = hentJournalListe();
    }
    public void opretNyJournal(String navn, String adr, String tlf, String cpr, Konsultationer kons){
        journal = new JournalObjekt(navn, adr, tlf, cpr, kons);
       
       
       
   
    }
    private JournalListe hentJournalListe(){
   
    try {
        ois = new FileInputStream("filnavn.ser");
    } catch (FileNotFoundException e) {
        System.out.println("Filen kunne ikke findes" + e);
        //derefter laver vi en ny fil og gemmer den (foregår i JournalListe-klassen):
        jl = new JournalListe();
       
        try {
            jl.gemJournalListe();
        } catch (IOException b) {
            //Hvis ikke filen kan gemmes, så fang fejlen og skriv den ud:
            System.out.println("filen kunne ikke gemmes" + b);
        }
    }
           
            try {
                in = new ObjectInputStream(ois);
            } catch (IOException e) {
            }
            try {
                hentListe = (JournalListe) in.readObject();
            } catch (IOException e) {
                System.out.println(e);
            } catch (ClassNotFoundException e) {
            }
            try {
                in.close();
            } catch (IOException e) {
               
            }
            System.out.println(hentListe);
            return hentListe;   
    }   
    public Vector soegEfter(String navn){
    Iterator it = jl.iterator();
    Vector returVector = new Vector();
    JournalObjekt currentJournal;
    int i = 1;
    while(it.hasNext()){
        currentJournal = (JournalObjekt)it.next();
            if(currentJournal.getNavn().equalsIgnoreCase(navn) ){
            returVector.add(currentJournal);
            }
//        System.out.println(i);   
//        i = i++;
           
    }
    System.out.println(returVector);
    return returVector;       
    }       
       
    /**
    * Method gemJournalListe.
    * Beder JournalListe-objektet jl om at gemme sig selv.    
    */
    public void gemJournalListe() throws IOException
    {try {
        jl.gemJournalListe();
    } catch (IOException e) {
    System.out.println(e);//skriver fejlen ud i konsollen.    
    }
    }

    public void tilfoejJournalObjekt(JournalObjekt j){
        jl.add(j);
       
        //System.out.println(jl);
    }
    public void gemJournalObjekt(JournalObjekt j){
        if(jl.contains(j)){
            System.out.println("objektet eksisterer i listen");
        int i =jl.indexOf(j);
        System.out.println("gemmer objektet på plads" + i);
        jl.set(i, j);
        try {
            gemJournalListe();
        } catch (IOException e) {
            System.out.println(e);
        } //så gemmer vi også lige hele listen..   
           
        }
        //objelktet eksisterer ikke..
        System.out.println("Objektet eksisterer ikke, og gemmes i Listen..");
        gemJournalObjekt(j);
       
    }       
}


JOURNALGUI:import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
/**
* @author ehdaniel
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class JournalGUI extends Forside implements ActionListener{
    private JLabel label = new JLabel("Søg efter journal:");
    public JTextField soegeFelt = new JTextField(20);
    private JButton soeg, nyKlient;
    Container container = getContentPane();
    private Controller cont;
   
    public JournalGUI(){
    cont = new Controller();
    JPanel journalPanel = new JPanel();
//    journalPanel.setLayout(new FlowLayout());
   
    soeg = new JButton("Søg!");
    nyKlient = new JButton("Opret ny klient:");
    journalPanel.add(label, BorderLayout.SOUTH);
    journalPanel.add(soegeFelt, BorderLayout.SOUTH);
    journalPanel.add(soeg, BorderLayout.SOUTH);
    journalPanel.add(nyKlient, BorderLayout.SOUTH);
    container.add(journalPanel, BorderLayout.SOUTH);
    tabJournal.add(journalPanel);
    soeg.addActionListener(this);
    }
    public void actionPerformed(ActionEvent e){
    if (e.getSource() == soeg){
        Vector v = cont.soegEfter(soegeFelt.getText());
    System.out.println("Der blev trykket på søg!");   
    System.out.println(v);
    if(v.isEmpty()){
    System.out.println("der findes ingen med navnet:" + soegeFelt.getText());    
    }
    if (v.size()>1){
    System.out.println("Der findes flere med navnet.. vi kan pt. ikke håndtere dette..");   
       
    }
    if (v.size() ==1){
    System.out.println("Der blev fundet 1 resultat, og det er her: ");   
    JournalObjekt jo = (JournalObjekt) v.get(0);
    System.out.println(jo.getAdresse());
       
    KlientJournalGUI kjg = new KlientJournalGUI(jo,cont);   
    //String navn = jo.getNavn();
//    String n= jo.getNavn();
//    navn.setText(n);
    }       
    }   
    }
    public static void main(String[] args) {
        JournalGUI jg = new JournalGUI();
        jg.setVisible(true);
        //Forside f = new Forside();
        //f.setVisible(true);
    }
}
KLIENTJOURNALGUI:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


/**
* @author ehdaniel
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class KlientJournalGUI extends Forside implements ActionListener{
    private JButton gem, kontrakt, diagnoseskema;
    private JTextField navn = new JTextField();
    private JTextField adresse = new JTextField();
    private JTextField tlfnr = new JTextField();
    private JTextField cprnr = new JTextField();
    private JTextField dato = new JTextField();
    private JournalObjekt jo;
    private JTextField konsultationsnr = new JTextField();
    private JTextArea journal = new JTextArea(" Journal:",15,60);
//    HUSK AT DER IKKE KAN GEMMES SÆRLIG MEGET TEKST!!!
    private JLabel tomKnap1, tomKnap2,tomKnap3, tomKnap4, tomKnap5,
    tomKnap6, tomKnap7, tomKnap8, tomKnap9, tomKnap10, tomKnap11, tomKnap12,
    tomKnap13, tomKnap14, tomKnap15, tomKnap16;
    private String n = new String();
    private Controller cont;
   
    public KlientJournalGUI(JournalObjekt initJo, Controller c){
    jo= initJo;
    cont = c;
    JPanel north = new JPanel();
    JPanel center = new JPanel();
    JPanel south = new JPanel();
   
    north.setLayout(new GridLayout(6,2));
    center.setLayout(new GridLayout(1,1));
    south.setLayout(new GridLayout(1,1));
   
    JLabel label = new JLabel("Navn:", JLabel.LEFT);
    north.add(label);
    north.add(navn);
   
    tomKnap1 = new JLabel ("");// vær lige obs om det skal være med JLabel først
    north.add(tomKnap1);
    tomKnap2 = new JLabel ("");
    north.add(tomKnap2);
    kontrakt = new JButton("Kontrakt");
    kontrakt.addActionListener(this);
    north.add(kontrakt);
    label = new JLabel("Adresse:", JLabel.LEFT);
    north.add(label);
    north.add(adresse);
    tomKnap3 = new JLabel ("");
    north.add(tomKnap3);
    tomKnap4 = new JLabel ("");
    north.add(tomKnap4);   
    tomKnap5 = new JLabel ("");
    north.add(tomKnap5);
    label = new JLabel("Tlf.nr:", JLabel.LEFT);
    north.add(label);
    north.add(tlfnr);
    tomKnap6 = new JLabel ("");
    north.add(tomKnap6);
    tomKnap7 = new JLabel ("");
    north.add(tomKnap7);
    diagnoseskema = new JButton("Diagnoseskema");
    diagnoseskema.addActionListener(this);
    north.add(diagnoseskema);
    label = new JLabel("Cpr.nr:", JLabel.LEFT);
    north.add(label);
    north.add(cprnr);
    tomKnap8 = new JLabel ("");
    north.add(tomKnap8);
    tomKnap9 = new JLabel ("");
    north.add(tomKnap9);
    tomKnap10 = new JLabel ("");
    north.add(tomKnap10);
    tomKnap11 = new JLabel ("");
    north.add(tomKnap11);
    tomKnap12 = new JLabel ("");
    north.add(tomKnap12);
    tomKnap13 = new JLabel ("");
    north.add(tomKnap13);   
    tomKnap14 = new JLabel ("");
    north.add(tomKnap14);
    tomKnap15 = new JLabel ("");
    north.add(tomKnap15);   
    label = new JLabel("Dato:", JLabel.LEFT);
    north.add(label);   
    north.add(dato);   
    tomKnap16 = new JLabel ("");
    north.add(tomKnap16);   
    label = new JLabel("Konsultationsnr:", JLabel.RIGHT);
    north.add(label);
    north.add(konsultationsnr);
   
    center.add(journal);
    gem = new JButton("Gem");
    // HUSK AT RETURNERE TIL JournalGUI!!!
    gem.addActionListener(this);
    south.add(gem);
   
    tabJournal.add(north,BorderLayout.NORTH);
    tabJournal.add(center, BorderLayout.CENTER);
    tabJournal.add(south, BorderLayout.SOUTH);
    this.setVisible(true);
   
//    Her sætter vi tekst:
    navn.setText(jo.getNavn());
    adresse.setText(jo.getAdresse());
    tlfnr.setText(jo.getTlfnr());
    cprnr.setText(jo.getCprnr());

   
    //System.out.println(adresse);
    }
    public void actionPerformed(ActionEvent event){
        if (event.getSource() == gem){
            //    Herfra henter vi de opdaterede input:
            jo.setNavn(navn.getText());
            jo.setAdresse(adresse.getText());
            jo.setTlfnr(navn.getText());
            jo.setCprnr(navn.getText());
           
        System.out.println("Gemmer");
       
       
        //Controller controller = new Controller();
        cont.gemJournalObjekt(jo);
        System.out.println("Virker jeg mon?");
        }else if (event.getSource()==kontrakt){
            System.out.println("Kontrakt");
        }else if (event.getSource()==diagnoseskema){
        System.out.println("Diagnoseskema");
        }
}

//public void setText()
//{
//  navn.setText(jo.getNavn());
// 
//}
//public static void main(String[] args){
//KlientJournalGUI k = new KlientJournalGUI();
//k.setVisible(true);
//}
}


TEST-KLASSE:

import java.io.IOException;
import java.util.Vector;

/**
* @author ehdaniel
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class TestJournal {
    private JournalObjekt minJournal, minJournal2, minJournal3;
    private String minStreng;
    private JournalListe jl;
public TestJournal(){
    Konsultationer konsultationer = new Konsultationer(1, "blabla");
    minJournal = new JournalObjekt("Per Nielsen", "Grønnegade", "86254565", "280260-5725", konsultationer);
    Controller nyCont = new Controller();
    nyCont.tilfoejJournalObjekt(minJournal);
    nyCont.soegEfter("Per Nielsen");
    try {
        nyCont.gemJournalListe();
    } catch (IOException e) {
    }
   
   
           
       
       
   
}
    public static void main(String[] args) {
    TestJournal minTest = new TestJournal();
    }
}
Avatar billede _carsten Nybegynder
19. december 2003 - 12:32 #1
EOF - siger at enden af en fil er nået

Du må et eller andet sted forsøge at læse videre i filen
Avatar billede ehdaniel Nybegynder
19. december 2003 - 12:36 #2
Jeg kan ikke lige se, hvor det er jeg ikke læser videre...Kan du se det i koden?
Avatar billede _carsten Nybegynder
19. december 2003 - 12:42 #3
Nej - ikke lige pt.
Avatar billede _carsten Nybegynder
19. december 2003 - 12:51 #4
Egentlig er jeg ikke den skrappeste til det her, men eksisterer filen "filnavn.ser" egentlig, og er der noget i den ??
Avatar billede _carsten Nybegynder
19. december 2003 - 12:56 #5
Hvis din første 'try' fejler og ois ikke bliver initieret, så laver du godt nok en ny fil, men i det videre foløb arbejder du stadig videre med 'ois'
            try {
                in = new ObjectInputStream(ois);
Avatar billede ehdaniel Nybegynder
19. december 2003 - 13:07 #6
Jeg tror jeg har fundet noget. Vi prøvede at slette den serialiserede fil, og starte op igen, så vi var sikre på at der kun var "friske objekter" i den. Derefter virkede det faktisk - bortset fra at systemet crashede fordi der var noget der stod og kørte i en løkke. metoden står neden under her. Kan du se hvordan vi får standset den løkke uden at ødelægge funktionalitet? (j er et objekt af typen journal, jl er vores liste).

public void gemJournalObjekt(JournalObjekt j){
        if(jl.contains(j)){
            System.out.println("objektet eksisterer i listen");
        int i =jl.indexOf(j);
        System.out.println("gemmer objektet på plads" + i);
        jl.set(i, j);
        try {
            gemJournalListe();
        } catch (IOException e) {
            System.out.println(e);
        } //så gemmer vi også lige hele listen..   
           
        }
        //objektet eksisterer ikke..
        System.out.println("Objektet eksisterer ikke, og gemmes i Listen..");
        gemJournalObjekt(j);   
    }
Avatar billede ehdaniel Nybegynder
19. december 2003 - 13:10 #7
Ois og alt det der har virket tidligere ( jeg forbander mig selv over ikke at have lavet flere versioner af samme system!) Filen filnavn.ser eksisterer, og kan altid dannes ud fra testklassen. Se mit ovenstående, tror du ikek pogså det er noget der? Jeg får jo ikke fejl i min iterator mere, nu kører løkken bare uden fejl (fejlen ligger så bare i at man ikke kan gøre noget med programmet).
Avatar billede _carsten Nybegynder
19. december 2003 - 13:20 #8
Prøv lige at se sidste linie i gemJournalObjekt()

public void gemJournalObjekt(JournalObjekt j){
        if(jl.contains(j)){
            System.out.println("objektet eksisterer i listen");
        int i =jl.indexOf(j);
        System.out.println("gemmer objektet på plads" + i);
        jl.set(i, j);
        try {
            gemJournalListe();
        } catch (IOException e) {
            System.out.println(e);
        } //så gemmer vi også lige hele listen..   
           
        }
        //objelktet eksisterer ikke..
        System.out.println("Objektet eksisterer ikke, og gemmes i Listen..");
        gemJournalObjekt(j);
       
    }
Avatar billede _carsten Nybegynder
19. december 2003 - 13:25 #9
Den kommer aldrig ud af den metode igen, vil cykle rundt der hele tiden

OK - det var også det du prøvede at fortælle!!

Kan du ikke bare // - mens der tænkes
//gemJournalObjekt(j);
Avatar billede _carsten Nybegynder
19. december 2003 - 13:29 #10
Kan du ikke lade gemJournalObjekt(j) og gemJournalListe returnere en boolean og teste på den - så skulle det jo køre
Avatar billede ehdaniel Nybegynder
19. december 2003 - 13:31 #11
Ok, jeg udkommenterer lige til at starte med.
Ideen er jo at jeg fremkalder et objekt fra en serialiseret fil og den har jo nogle parametre. Disse parametre vil jeg derefter ændre på (fx en anden adresse) og deefter gemme på samme plads i listen, objektet er stadig det samme. Det sker vel ikke hvis jeg ikke siger gemJournalObjekt med argumentet objektet?
Avatar billede ehdaniel Nybegynder
19. december 2003 - 13:45 #12
Okay, jeg tror slet ikek jeg behøver at sige gemJournalObjekt. Det virker alligevel uden :-) Objektet gemmes med de nye parametre.

Tør du tage et spørgsmål mere eller vil du hellere have points med det samme? Vi har nemlig noget andet, vi ikke er helt sikre på :-)
Avatar billede _carsten Nybegynder
19. december 2003 - 13:48 #13
Har lige skrevet hele klassen ud for bedre at se det, men mener ikke det skal kaldes igen

Ja - skyd løs
Avatar billede _carsten Nybegynder
19. december 2003 - 13:59 #14
Altså med spørgsmål
Avatar billede _carsten Nybegynder
19. december 2003 - 14:10 #15
Hvis i skal lave noget med at kalde gemJournalObjekt(j); igen, så lad gemJournalListe() returnere en boolean og test på den, men på den anden side, hvis gemJournalListe() ikke returnerer true, hjælper det ikke at forsøge med med køre gemJournalObjekt(j); igen, den vil stadig fejle, sååhhh.......


        try {
            if( !gemJournalListe() )
                gemJournalObjekt(j);

        } catch (IOException e) {
            System.out.println(e);
        } //så gemmer vi også lige hele listen..   
           
        }
Avatar billede ehdaniel Nybegynder
19. december 2003 - 14:10 #16
Okay :-) Objekttypen JournalObjekt har nogle paramtre med. Et af dem er et andet objekt, som hedder konsultationer. Der er et objekt der har to parametre, tekst og et tal. Vi skal bruge det til at lave en GUI (journal) hvor man skal kunne skrive noget tekst og gemme det som objekttype journal inde i objektet Journal. For hver gang man gemmer en journal skal konsultationsnummeret opdatere sig.  Grunden til dette er at man skal kunne skrive en journaltekst en dag og så kunne gå tilbage og se tidligere journaler. Disse konsultationer er oprettet i en liste. Derfor kan vi ikke bare sige .setText som vi har gjort med vores JTextFields (dem vi har navn og adresse i). Vores JTextArea ligger nemlig i en ArrayList i konsultationsklassen. Den får du lige koden på her nedenunder. Giver det mening?

Altså alt i alt, det vi spørger om er, hvordan får vi den til at gemme teksten i JTextArea sammen med nummeret for hver indsat værdi i arrayListen?

import java.io.*;

/**
* @author Elisabeth H. Danielsen og Ditte Vuholm
*
*/
public class Konsultationer implements Serializable{
    private int initkonsultationsNr;
    private String initkonsultationsTekst;
   
    public Konsultationer(int konsultationsNr, String konsultationsTekst){
   
    initkonsultationsNr = konsultationsNr;
    initkonsultationsTekst = konsultationsTekst;
   
    }

    /**
    * Returns the konsultationsTekst.
    * @return String
    */
    public String getKonsultationsTekst() {
        return initkonsultationsTekst;
    }

    /**
    * Returns the konsultationsNr.
    * @return int
    */
    public int getKonsultationsNr() {
        return initkonsultationsNr;
    }

    /**
    * Sets the konsultationsTekst.
    * @param konsultationsTekst The konsultationsTekst to set
    */
    public void setKonsultationsTekst(String konsultationsTekst) {
        this.initkonsultationsTekst = konsultationsTekst;
    }

    /**
    * Sets the konsultationsNr.
    * @param konsultationsNr The kunsultationsNr to set
    */
    public void setKonsultationsNr(int konsultationsNr) {
        this.initkonsultationsNr = konsultationsNr;
    }

}
Avatar billede _carsten Nybegynder
19. december 2003 - 14:12 #17
Vender tilbage senere på dagen/aftenen, pt. fyraften - og på vej hjem
Avatar billede nielyng Nybegynder
19. december 2003 - 14:58 #18
Hej Elisabeth! (og Ditte.. )

Så bare lige Jeres post.. Er selv inde efter noget Lingo.. Håber I har vind i sejlene, og det går som det skal..

Tilbage til Jeres spørgsmål. Har Jeg forstået det rigtigt, når du/I skriver, at Jeres JTextAreas ligger i konsultationsklassen?! Det ser ikke sådan ud.. MEN:

Der, hvor I skal bruge oplysningerne, der kan I vel be' de enkelte konsultationer (som I kan hive ud af Jeres ArrayListe) om getKonsultationsNummer() og getKonsultationsTekst(), og derefter lade Jeres JTextarea sætte teksten? noget alá:

JTextArea mitTextArea.setText(konsultation.getKonsultationsNummer());

??

/Niels
Avatar billede _carsten Nybegynder
19. december 2003 - 16:03 #19
Nå - jeres sidste spørgsmål er jo åbenbart besvaret af nielyng, og jeg vil give ham ret stort set hele vejen, på nær sidste linie, som jeg ville tackle lidt anderledes, men det afhænger af hvordan og hvornår konsultationsnr. tilføjes.
Hvis det tilføjes inden der skrives i TextArea er den ok, ellers sådan

String s = mitTextArea.getText() + "\n";
mitTextArea.setText(konsultation.getKonsultationsNummer() + s);

Ellers mister i den tekst som eventuelt måtte være skrevet i TextArea
Avatar billede nielyng Nybegynder
19. december 2003 - 16:20 #20
jep,sådan havde jeg også tænkt det.. Altså, kig på Carstens kode, hvis I vil lægge teksten til den eksisterende tekst i JTextAreaet..

Men så bør I jo nok lige tænke over, hvordan disse konsultationer skal gemmes ned igen. Hvis det hele bliver lagt i et enkelt tekstfelt, og der så rettes I det, hvordan skal den nye konsultation så oprettes? .. Eller har I et tekstfelt til hver konsultation?

Håber ikke I blev mere forvirrede af den smøre.. ;-)

/Niels

p.s: Hils i T2.. :-)
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