Toon posts:

[Java]object in lijst?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe komt het dat het programma dat ik maakte een error geeft tijdens het uitvoeren maar niet tijdens het compileren.

Ik heb gezocht waar de fout lag, en hij doet het niet vanaf dat ik een object in een lijst wil opslaan.

Ik doe hetvolgende:
code:
1
2
    Persoon f=new Persoon();
    telefoonboek.addElement(f.leesPersoonIn());

En Persoon is een object dat ik maakte via de classe Persoon en een dat bestaat uit een voornaam en een familienaam en een telefoonnummer.

Het aanmaken van de Persoon f doet hij wel want ik kan hem met de methode toString printen op het scherm, hij wil dit alleen niet opslaan in een lijst.

Komt dit omdat Persoon geen object type is ofzo?

Hoe kan ik zorgen dat ik dit dan wel kan opslaan in een lijst???,

Verwijderd

telefoonboek is dus een vector neem ik aan?

wat is de return type van f.leesPersoonIn() ?
wat doet die method precies?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
De fout zal denk ik niet in het toevoegen aan de lijst zitten maar in de leesPersoonIn methode. Kan je misschien je foutmelding even posten?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
returntype van leesPersoonIn() is een Persoon.

En Persoon is een apparte klasse die ik maakte, waarin 2 strings zijn opgeslaan (voornaam en naam) en één telefoonnummer (dat gemaakt is via de klasse Telefoonnummer, die dus 3 ints bevat).

telefoonboek is idd een Vector

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
H:\javaprogrammeren\unif>java HetGroteTelefoonBoekProgramma
Het grote telefoonboek (c) Gompie and Pikachuf 2001
*****MENU*****
<T>elefoonboek maken
<O>penen telefoonboek
O<p>slaan telefoonboek
<W>eergeven telefoonboek
<E>inde /n
Geef je keuze in: T
Wilt u een persoon invoeren <J>a J
Geef een familienaam:  famnaam
Geef een voornaam:  voornaam
Geef landcode:  0032
Geef zonenummer:  09
Geef abonneenummer:  2225566
voornaam famnaam/n/t+(32)9/2225566
Exception in thread "main" java.lang.NullPointerException
      at Telefoonboek.leesTelefoonboekIn(Telefoonboek.java:48)
      at HetGroteTelefoonBoekProgramma.main(HetGroteTelefoonboekProgramma.java
:24)

zoals je kan zien wordt de Persoon goed geconstueerd (voornaam famnaam/n/t+(32)9/2225566) en begint de fout bij het opslaan van het object.

de overeenstemmende source:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Telefoonboek leesTelefoonboekIn() throws IOException{
    InputStreamReader isr = new InputStreamReader (System.in);
    BufferedReader in = new BufferedReader(isr);
    char c = 'J';
    do{
          Text.prompt("Wilt u een persoon invoeren <J>a");
          c = Text.readChar(in);
        Persoon f=new Persoon();
        f = f.leesPersoonIn();
        System.out.println(f);
        telefoonboek.addElement(f);
        System.out.println("TEST");
    }while (c == 'J' || c == 'j');
    Telefoonboek boek = new Telefoonboek(telefoonboek);
    return boek;
}

Verwijderd

Krijg je geen null pointer exception?

waarschijnlijk komt er null uit f.leesPersoonIn()

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

een nullpointer een object bestaat dus niet, welke is regel 48 ?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik denk dat telefoonboek 'null' is. Je hebt je lijst dus nog niet geinitialiseerd.

Print de waarde van telefoonboek maar eens voordat je een element toevoegt :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

post effe de Persoon class, en met name de leesPersoonIn method.

Verwijderd

denk dat mbravenboer gelijk heeft

Pas op de je niet je Vector zo in een constructor initializeerd:

Vector telefoonboek = new Vector();

maar zo:

telefoonboek = new Vector()

Indien telefoonboek in je classe is gedeclareerd...

anders wordt ie alleen locaal in je constructor geinit...

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
<off-topic: heeft niets met je fout te maken>
pikachuf:
code:
1
2
Persoon f=new Persoon();
f = f.leesPersoonIn();
Lever je in leesPersoonIn() een nieuw Persoon object op? Ja -> waarom maak je de methode leesPersoonIn dan niet static? Nee -> waarom dan deze assignment?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// De klasse Persoon

import java.io.*;
import javagently.*;
import java.util.*;

class Persoon{
    private String familienaam;
    private String voornaam;
    private Telefoonnummer telefoon;

    public Persoon() {};

    public Persoon(String familienaam, String voornaam, Telefoonnummer telefoon){
        this.familienaam = familienaam;
        this.voornaam = voornaam;
        this.telefoon = telefoon;       
    }

    public String geefFamilienaam(){
        return familienaam;
    } 
    public String geefVoornaam(){
        return voornaam;
    } 
    public Telefoonnummer geefTelefoon(){
        return telefoon;
    }

    public void wijzigFamilienaam(String fam){
        familienaam = fam;
    }
    public void wijzigVoornaam(String v){
        voornaam = v;
    }
    public void wijzigTelefoonnummer(Telefoonnummer telefoon){
        this.telefoon = telefoon; //zelfde als schrijven telefoon = tel als ge tel als invoer zou geven
    }

    public String toString(){
        String totaal = voornaam+" "+familienaam+"/n/t"+telefoon;
        return totaal;
    }

    public Persoon leesPersoonIn() throws IOException{
        InputStreamReader isr = new InputStreamReader (System.in);
        BufferedReader in = new BufferedReader(isr);
            Text.prompt("Geef een familienaam: ");
            String fam = in.readLine();
            Text.prompt("Geef een voornaam: ");
            String voor = in.readLine();
            Telefoonnummer tel = new Telefoonnummer().leesTelefoonnummerIn();
            Persoon p = new Persoon(fam, voor, tel);
            return p;
    }
}

Maar euh, ik denk dat je dees ook nuttig kan vinden:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
class Telefoonboek{
    private Vector telefoonboek ;

    public Telefoonboek() {};

    public Telefoonboek(Vector telefoonboek){
        this.telefoonboek = telefoonboek;
    }

    public static void opslaan(Telefoonboek telefoonboek) throws IOException{
        PrintWriter out = Text.create("opslaan.txt");
        out.println(telefoonboek);
        out.close();
    }

    public Vector geefLijst(){
        return telefoonboek;
    }

    public String toString(){
        Vector lijst = new Vector();
        for(int p=0;p<geefLijst().size();p++){
            lijst.addElement((geefLijst()).elementAt(p));
        }
        String totaal = "";
        for(int t=0;t<geefLijst().size();t++){
            totaal += lijst.elementAt(t)+"/n";
        }
        return totaal;
    }

    public Telefoonboek leesTelefoonboekIn() throws IOException{
        InputStreamReader isr = new InputStreamReader (System.in);
        BufferedReader in = new BufferedReader(isr);
        char c = 'J';
        do{
        Text.prompt("Wilt u een persoon invoeren <J>a");
        c = Text.readChar(in);
        Persoon f=new Persoon();
        f = f.leesPersoonIn();
        System.out.println(f);
        telefoonboek.addElement(f);
        System.out.println("TEST");
        }while (c == 'J' || c == 'j');
        Telefoonboek boek = new Telefoonboek(telefoonboek);
        return boek;
    }
}

telefoonboek komt dus van hier:
private Vector telefoonboek ;

Verwijderd

ik zou dit veranderen
public Telefoonboek() {};

naar

public Telefoonboek() {
this(new Vector());
}

Verwijderd

Topicstarter
Op zondag 16 december 2001 15:11 schreef tijnbraun het volgende:
ik zou dit veranderen
public Telefoonboek() {};

naar

public Telefoonboek() {
this(new Vector());
}
Yoepie you've et right!!! Hoe kom je daar nu bij?

thanks!!!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je moet ergens de methode leesTelefoonBoekIn aanroepen. Je moet dan een instantie van een telefoonboek hebben en dus moet je al ergens een Vector hebben aangemaakt (edit: oeps dat hoeft dus niet, want je hebt een lege constructor... dat is dus erg verwarrend en zorgt voor de fout). In de methode leesTelefoonBoekIn maak je echter weer een nieuw TelefoonBoek aan :? Allemaal erg verwarrend...

Beter kan je dit doen:

1. Maak een klasse TelefoonBoek die geen argumenten meekrijgt.

2. Maak een methode addPersoon in het telefoonboek die een persoon toevoegt aan de lijst.

3. Maak in de klasse Persoon een static methode: leesPersoonIn. Deze leest een persoon in en levert deze op.

4. Maak liefst buiten telefoonboek een methode die een telefoonboek aanmaakt. Deze methode maakt eerst een lege instantie van een TelefoonBoek en vraagt daarna of je een persoon wilt inlezen. Deze lees je in via de methode Persoon.leesPersoonIn. Deze methode is static en levert een Persoon op. Deze Persoon voeg je daarna toe aan het telefoonboek via de methode addPersoon(Persoon p).

Zo is het allemaal een stuk duidelijker :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik zie nog meer hele rare dingen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public String toString()
{
    Vector lijst = new Vector();
    for(int p=0;p<geefLijst().size();p++)
    {
       lijst.addElement((geefLijst()).elementAt(p));
    }

    String totaal = "";

    for(int t=0;t<geefLijst().size();t++)
    {
        totaal += lijst.elementAt(t)+"/n";
    }

    return totaal;
}

1. Waarom ga je hier een nieuwe lijst aanmaken? Je hebt toch zelf deze lijst in je bezit?


2. Het opbouwen van een String door steeds iets erbij op te tellen is erg langzaam omdat er ontzettend veel Strings worden aangemaakt. Beter kan je dit doen met een StringBuffer en de append methoden van StringBuffer.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Yep het is idd overbodig om nieuwe lijst te maken, die strings ga ik wel nog zo aanelkaar plakken hoor, want wij hebben nog geen andere methodes gezien om dat te doen.

Bedankt voor alle reply's

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
pikachuf: Yep het is idd overbodig om nieuwe lijst te maken, die strings ga ik wel nog zo aanelkaar plakken hoor, want wij hebben nog geen andere methodes gezien om dat te doen.
Simpel API documentatie lezen :) . Als je alleen functies gebruikt die je ooit hebt geleerd, kom je niet zo ver ;) .
code:
1
2
3
4
5
6
7
8
StringBuffer buffer = new StringBuffer();
buffer.append("Hello, ");
buffer.append(' ');
buffer.append("welcome to ");
buffer.append("StringBuffer!");

String result = buffer.toString();
System.out.println(result);

Zal afdrukken:

Hello, welcome to StringBuffer!

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Héhé thanks!!!
Pagina: 1