Toon posts:

[Java] Bestand inlezen zorgt voor foutmelding

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ben al een tijdje bezig met Java maar heb besloten om het tempo wat hoger te leggen en wat voorop te lopen in de lessen die ik krijg op school. Ik heb wat zitten proberen om bestanden in te lezen en dit lukte allemaal vrij goed, maar ik struikel nog over een foutmelding. Volgens mij heeft het niet te maken met het inlezen van het bestand (dit lukt wel goed), maar moet er nog ergens een fout zitten in mijn code...
Maar ik geraak er niet aan uit :(

De foutmelding zit hem in volgende methode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void tekstImport() {
    int regelNummer = 0;
    BufferedReader in;
    String regel;
    StringBuffer temp3 = new StringBuffer();
    try {
        in = new BufferedReader(new FileReader(locatie) );
        while ((regel = in.readLine() ) != null ) {
        temp3.append(regel);
        for (int i = 0 ; i < temp3.length(); i++) {
            if (temp3.charAt(i) == ';') {
            componentenRij[regelNummer] = temp3.substring(0,i-1);
            prijsRij[regelNummer] = Double.parseDouble(temp3.substring( i+1 ,temp3.length() ));
            }
        }
        temp3.delete(0,temp3.length());
        regelNummer++;
        in.close();
        System.out.println(regel);
        }
    }   
    catch (FileNotFoundException e) {
        System.out.println("Kan bestand niet vinden");
    }
    catch (IOException e) {
        System.out.println("Fout bij lezen of sluite bestand");
        e.printStackTrace();
    }
    
    for(int i = 0; i < laatsteRegel; i++){ //moet eindigen op laatste tekstwaarde in array
        //er zitten nog 'null' elementen in de array, deze moeten geskipt worden
        //keuzeLijst.add(componentenRij[i]);
        System.out.println(""+componentenRij[i]);
    }
    }

Zorgt voor deze foutmelding:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Fout bij lezen of sluite bestand
java.io.IOException: Stream closed
    at java.io.BufferedReader.ensureOpen(BufferedReader.java:97)
    at java.io.BufferedReader.readLine(BufferedReader.java:293)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at winkel.tekstImport(winkel.java:39)
    at winkel.<init>(winkel.java:91)
    at winkel.main(winkel.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at apple.launcher.LaunchRunner.run(LaunchRunner.java:88)
    at apple.launcher.LaunchRunner.callMain(LaunchRunner.java:50)
    at apple.launcher.JavaApplicationLauncher.launch(JavaApplicationLauncher.java:52)


Zoals ik al zei, ligt het niet aan het commande om het bestand te lezen, want als ik het volgende intyp onder mijn while: System.out.println(regel) dan komt alles erop.
Als er iets tekort is van declaratie moet je het maar zeggen. Mijn volledige applicatie hier posten zou deze post wat erg lang maken :-P
Bedankt om alvast te kijken! :>

Verwijderd

hmm, waarom zit de close in de while-loop? Lijkt me minder handig

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14:38
Het probleem zou duidelijker zichtbaar zijn als je consequent in zou springen:
Java:
38
39
40
41
42
43
44
45
46
47
48
49
50
51
in = new BufferedReader(new FileReader(locatie) );
while ((regel = in.readLine() ) != null ) {
    temp3.append(regel);
    for (int i = 0 ; i < temp3.length(); i++) {
        if (temp3.charAt(i) == ';') {
            componentenRij[regelNummer] = temp3.substring(0,i-1);
            prijsRij[regelNummer] = Double.parseDouble(temp3.substring( i+1 ,temp3.length() ));
        }
    }
    temp3.delete(0,temp3.length());
    regelNummer++;
    in.close();                    //   <---------- 
    System.out.println(regel);
}

Als je een regel hebt gelezen, sluit je binnen je lus het bestand (zie de aangegeven regel) en logischerwijs faalt de volgende aanroep van readLine. De exception is ook duidelijk over wat er mis gaat: het bestand is niet (meer) open.

Goed inspringen is essentieel om dit soort fouten in de program flow makkelijk te kunnen spotten. Zorg dus dat je je code altijd goed in laat springen en dat geldt dubbel als je het hier gaat posten.

Nog een andere tip: door je code blok te beginnen met [code=java,123] kun je aangeven dat je code begint bij regel 123, zodat de regelnummers in de foutmelding overeenkomen met de regelnummers bij de code die je post. Nu moet ik uit de context maar afleiden dat regel 8 correspondeert met regel 39 en dat maakt het natuurlijk niet makkelijker.

Verwijderd

Topicstarter
Soultaker ik wil je enorm bedanken voor de hulp dat je me gegeven hebt! Dankzij jouw post heb ik het probleem kunnen oplossen. Ik zal al je tips nog eens goed lezen en bij de volgende post zal ik ze ook toepassen!
Over het inspringen: dit iets wat XCode automatisch doet op deze manier. Nog niet gerealiseerd dat het mooier kan. Zal dit ook eens bekijken.

Nogmaals super bedankt jullie beiden!
*;

  • Jochem Knoops
  • Registratie: November 2000
  • Laatst online: 25-11-2025
Nog mooier is het om ook finally te gebruiken en daarin de stream te closen.
Dan sluit hij namelijk netjes alles af, OOK al krijgt hij een Exception,

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:26
Nog mooier is om gewoon even je code te debuggen; stap voor stap je code laten uitvoeren, dan had je ook wel gezien dat die Close() in je while stond... :)

https://fgheysels.github.io/

Pagina: 1