Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Java] Arrays en methodes probleem

Pagina: 1
Acties:
  • 423 views

Verwijderd

Topicstarter
Hallo beste tweakers en programmeergoden,

ik zit met het volgende;
ik werk aan een opdracht om Java te leren kennen, en het doel is om een bibliotheek te simuleren.
Ik heb 3 klassen (Boek, Lid en BibMain) waar alles in geregeld wordt.
Nu is de volgende stap het toevoegen van arrays in dit stukje code van de klasse Lid:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Lid {

    public Lid(String naam, String adres, String postcode, String woonplaats, int idNummer, Boek boek){
        this.setNaam(naam);
        this.setAdres(adres);
        this.setPostcode(postcode);
        this.setWoonplaats(woonplaats);
        this.setIdNummer(idNummer);
        this.setBoek(null);
    }

private Boek boek;
 
public Boek getBoek()
{
    return boek;
}

public void setBoek(Boek boek ){
    this.boek = boek;
}


Het moet zo zijn dat een Lid maximaal 3 boeken tegelijk in bezit kan hebben. En ik zit eerlijk gezegd volledig vast en snap ineens niets meer van Java heb ik het idee.

Dit is wat ik nu heb:
Java:
1
2
3
4
5
6
7
8
9
10
private String[] boeken = new String[3];

public String[] getBoeken()
{
    return boeken;
}

public void setBoeken(String[] boeken ){
    this.boeken = boeken;
}


(Het boek beval aan om van Boek, Boeken te maken. Misschien ben ik daardoor al wel in de war)

Maar vanaf dit punt zit ik dus vast. Mijn methodes kloppen ineens niet meer en ik heb geen idee hoe ik iets in die Array zet (mbv een methode) en iets eruit haal.

Via de search en google kom ik alleen op generieke dingen uit, en ik ben inmiddels zo in de war dat dat niet helpt.
Ik hoop dat jullie hulp kunnen bieden!

  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Je zou eerst eens naar de documentatie en artikelen over arrays in Java moeten kijken: hier en hier (die laatste zal echter geen oplossing voor je probleem geven).

Om een gegeven aan een array toe te voegen, heb je drie dingen nodig: De array zelf, het gegeven om toe te voegen, en een index, een cijfer dat aangeeft waar je op dat moment in de array zit (of, de array index van het laatst toegevoegde item). Deze index begint bij 0, bij een lege array. Wanneer je een item toevoegt, zet je dat item in de array op de positie die de index aangeeft, en verhoog je de index met 1.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Test
{

    private int index = 0;
    private String[] boeken = new String[3];
    
    public void Add(Boek boek) {
        boeken[index] = boek;
        index = index + 1;
    }
    
    public Boek getBoek(int index) {
        return boeken[index];
    }
   
// etc
}


Maar ik zou eerst eens een generieke tutorial mbt arrays doen, zodat je het basisconcept van arrays kent. Daarna zou ik naar de Java List-classes kijken, waar je lijsten met gegevens in kunt stoppen zonder je druk hoeven te maken over array indices en dergelijke.

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 22:06
Je probeert een String (text) toe te voegen terwijl je bij het aanmaken van Lid een Boek object er in stopt? Je zult een array van Boeken moeten maken ( boeken[3]).

Strava | AP | IP | AW


Verwijderd

Topicstarter
Webgnome schreef op vrijdag 04 april 2008 @ 10:18:
Je probeert een String (text) toe te voegen terwijl je bij het aanmaken van Lid een Boek object er in stopt? Je zult een array van Boeken moeten maken ( boeken[3]).
Dat maakt niet uit, je kan
code:
1
type[] naam
gebruiken of
code:
1
type naam[]
gebruiken

Verwijderd

idd een aantal eenvoudige tutorials bekijken. Jij maakt een array aan die 3 elementen lang is. Je kan dus sowieso maar 3 boeken in je bib kwijt :D

Dus je maakt je array bijna goed, alleen zou ik er ipv String meteen Boek elementen van maken:

Java:
1
private Boek[] boeken = new Boek[3];


en dan kun je hier aan dmv een index (voor jou array is index van 0-2 geldig):

Java:
1
2
3
public Boek getBoek(int index){
  return boeken[index];
}


En je plaatst een boek als volgt in je bib:

Java:
1
2
3
public void addBoek(Boek boek, int index){
  boeken[index]=boek;
}


Nu is een bib van 3 boeken niet echt interessant dus ik zou eerder zien naar een Collection. Voordeel daarvan is dat deze zelf groeien in lengte als je er meer elementen in plaatst:

Java:
1
2
3
4
5
6
7
8
9
private List<Boek> boeken = new ArrayList<Boek>();

public Boek getBoek(int index){
  return boeken.get(index);
}

public void addBoek(Boek boek){
   boeken.add(boek);
}


Hoewel je nu kun je er dus nog aan met je index. Maar nog interessanter is je boeken op te slaan via ISBNR (wat uniek is) in een hashmap:

Java:
1
2
3
4
5
6
7
8
9
private Map<String, Boek> boeken = new HashMap<String, Boek>();

public Boek getBoek(String isbnr){
  return boeken.get(isbnr);
}

public void addBoek(Boek boek){
  boeken.put(boek.getISBNR(), boek);
}

[ Voor 0% gewijzigd door Verwijderd op 04-04-2008 10:27 . Reden: ff code=java van gemaakt ]


Verwijderd

Je kan idd zowel
Java:
1
String[] boeken

als
Java:
1
String boeken[]

gebruiken. Zie ook de verschillende schrijfwijzen voor de main method:

Java:
1
public static void main(String[] args)


Java:
1
public static void main(String args[])

[ Voor 27% gewijzigd door Verwijderd op 04-04-2008 10:30 ]


Verwijderd

Topicstarter
@capelleh:

Ik gebruik een array omdat ieder lid slechts 3 boeken mag lenen. De bibliotheek zal uiteindelijk veel meer boeken bevatten, maar een lid mag niet meer dan 3 tegelijk in bezit hebben.

Ik begin nu al weer wat te snappen ervan dus bedankt daarvoor iig :)

Ik had in eerste instantie ook
Java:
1
private Boek[] boeken = new Boek[3];


gebruikt, maar Eclipse deed daar moeilijk over dus had ik het veranderd.

Voor het toevoegen gebruikte ik deze methode:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void Lenen(Boek boek){
    if (this.getBoek()==null) {
        if (boek.getUitgeleend()) {
            System.out.println("Lid " + this.getNaam()+ " wil boek " + boek.getTitel() + " lenen, maar het boek is al uitgeleend.") ;
        }   else {
            boek.setLid(this) ;
            this.setBoek(boek) ;
            boek.setFreqUitgeleend(boek.getFreqUitgeleend()+1);
            boek.setUitgeleend(true) ;
            System.out.println("Lid " + boek.getLid().getNaam() + " leent boek " + boek.getTitel()) ;
            }
    }   
    else {
        System.out.println("Lid " + this.getNaam() + " wil boek " + boek.getTitel() + " lenen, maar hij/zij heeft al een boek geleend.") ;
        
    }
}


Nou is getBoek en setBoek fout omdat hij undefined is. getBoeken en setBoeken wil alleen ook niet, omdat hij volgens Eclipse verwijst naar een int. Hoe dit aan te passen?

en
Java:
1
if (this.getBoek()==null) {
zou moeten controleren of hij minder dan 3 boeken heeft geleend.

  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Dan zou je een functie getBoekCount() oid moeten maken die het aantal geleende boeken teruggeeft (een int-waarde), vervolgens die vergelijken met 3 (<3 oid). Om getBoeken en setBoeken te veranderen zou je het return type van die functies van int naar euh, Boek[] oid om moeten zetten.

Verwijderd

Het aantal elementen in je array vraag je zo op:

Java:
1
boeken.length


En dat zal een int teruggeven waar je dan op kan controleren.

Dat een array van Boek elementen niet lukt is vreemd, geef anders de error es door!?

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

wil alleen ook niet
Eeh wat gaat er dan mis? Ik gok dat je ergens foutmeldingen krijgt (en zeer waarschijnlijk vrij duidelijke zelfs) of dat je met een klein beetje debuggen je probleem vrij snel kan achterhalen.
Lees aub Programming Beleid eens door en geef nu aan wat er nu precies niet wil, wat het wel had moeten doen en welke foutmeldingen je kreeg en (jaja) wat je zelf al hebt geprobeerd om je fouten op te lossen. Nu geef je aan dat er "iets" misgaat en wij mogen het voor je oplossen en dat is niet de bedoeling hier.

Daarnaast: als je syntax errors e.d. krijgt dan wordt het tijd je documentatie er weer eens bij te pakken. We gaan er hier eigenlijk vanuit dat je dat soort fouten zelf op kan lossen want veel duidelijker worden de compiler meldingen echt niet ;)

[ Voor 17% gewijzigd door Creepy op 04-04-2008 11:16 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik heb nu het volgende
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void Lenen(Boek boek){
    if (this.boeken.length < 2) { //Als lid minder dan 3 boeken heeft geleend
        if (boek.getUitgeleend()) {
            System.out.println("Lid " + this.getNaam()+ " wil boek " + boek.getTitel() + " lenen, maar het boek is al uitgeleend.") ;
        }   else {
            boek.setLid(this) ;
            this.boeken[index]=boek ;
            boek.setFreqUitgeleend(boek.getFreqUitgeleend()+1);
            boek.setUitgeleend(true) ;
            System.out.println("Lid " + boek.getLid().getNaam() + " leent boek " + boek.getTitel()) ;
            }
    }   
    else {
        System.out.println("Lid " + this.getNaam() + " wil boek " + boek.getTitel() + " lenen, maar hij/zij heeft al een boek geleend.") ;
        
    }
}


Eclipse geeft aan dat de fout zit bij de eerste if-statement, alleen niet wat het probleem is.

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Niet om het 1 of ander hoor maar er is nu al meer dan 1 keer gevraagd naar de daadwerkelijke foutmelding die Eclipse geeft. En wat heb je nu zelf al gedaan om die foutmelding op te lossen?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 19:04

voodooless

Sound is no voodoo!

Eclipse geeft altijd aan wat er fout is. Lees eens de foutmelding en probeer deze te begrijpen!

Do diamonds shine on the dark side of the moon :?


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 19:37

Nick_S

++?????++ Out of Cheese Error

Kijk even naar de tips die Creepy je hier boven geeft. Zonder foutmelding kunnen we niks, glazen bollen geloven we in 2008 niet meer in.

Wat er dus al gezegd werd...

[ Voor 12% gewijzigd door Nick_S op 04-04-2008 11:22 . Reden: Refresh before post error ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
Het enige wat ik dus krijg is dit:
Exception in thread "main" java.lang.NullPointerException
at Lid.Lenen(Lid.java:226)
at BibAdmin.main(BibAdmin.java:48)

Waarbij het om de voorgenoemde regel gaat in beide gevallen. Het probleem is dus dat Eclipse niet zijn standaard kruisje aan de zijkant laat zien, noch het onderstreept om mij te vertellen wat de foutmelding is en hoe het mogelijk op te lossen is.

Verwijderd

Die foutmelding is wanneer je de code runt, en als die regelnummers verwijzen naar de eerste if dan is boeken in uw geval null. Die moet je es nazien, waar je die initialiseert.

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 18:44
Dit is een fout (een exception) die ontstaat tijdens het draaien van het programma. Kijk wat op regel 226 van Lid.java gebeurt, je geeft misschien een boek mee die je niet geïnitialiseerd hebt. Bijvoorbeeld:

Java:
1
2
3
Lid lid = new Lid();
Boek b;
lid.Lenen(b);

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Verwijderd

en minder dan 3 boeken is wel degelijk

Java:
1
boeken.length<3


Maar je array is gelijk hoe 3 elementen groot, dan moet je niet op de length gaan checken maar de elementen overlopen en tellen indien niet null, zoals iemand eerder zei. Mijn fout sorry.

[ Voor 62% gewijzigd door Verwijderd op 04-04-2008 11:38 ]


  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 22:06
Verwijderd schreef op vrijdag 04 april 2008 @ 11:32:
Het enige wat ik dus krijg is dit:
Exception in thread "main" java.lang.NullPointerException
at Lid.Lenen(Lid.java:226)
at BibAdmin.main(BibAdmin.java:48)

Waarbij het om de voorgenoemde regel gaat in beide gevallen. Het probleem is dus dat Eclipse niet zijn standaard kruisje aan de zijkant laat zien, noch het onderstreept om mij te vertellen wat de foutmelding is en hoe het mogelijk op te lossen is.
Hoezo wordt er niet gezegd wat de foutmelding is? Lid.java regel 226 en bibadmin regel 48.. En het gaat om een nullpointer.

[ Voor 6% gewijzigd door Webgnome op 04-04-2008 11:40 ]

Strava | AP | IP | AW


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:20

Janoz

Moderator Devschuur®

!litemod

Tja, er is een verschil tussen een runtime fout en een compile fout. Als er geen 'kringeltjes' onder staan is het geen compile fout. Deze exception is echter een runtime fout. Een nullpointer exception is behoorlijk duidelijk (als je hem kent). Het betekent dat je iets wilt doen met iets dat er niet is. Ik weet niet welke regel het hier om gaat, maar als dit om this.boeken.length gaat dan is zeer waarschijnlijk boeken nog niet geinitialiseerd. Hier zit dus nog geen array in waardoor boeken null is. Daar een methode op willen uitvoeren geeft inderdaad een nullpointerexception.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Precies, en die is met vrij simpel debuggen simpel op te lossen.

Programmeren is meer dan alleen dom klikken in je IDE (Eclipse in dit geval) en Eclipse heeft niet voor elke foutmelding een oplossing voor je. Soms moet je zelf even logisch nadenken. Als Eclipse alles voor je zou doen laat dan Eclipse gelijk je programma voor je genereren ;)

Anyway, ik ga dit topic sluiten. Je moet dit blijkbaar voor een opdracht doen maar je wil ons hier alles laten doen en dat is echt niet de bedoeling.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.