Toon posts:

[JAVA] Poging 2 Blackjack eveneens een NPE

Pagina: 1
Acties:

Onderwerpen


  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
In het vorige topic waar ik een soort gelijk probleem tegenkwam zijn flink wat tips voorbij gekomen. Uiteindelijk heb ik dus besloten om opnieuw te beginnen. Nu loop ik tegen hetzelfde probleem aan als vorige keer wat voor mij duidelijk maakt dat ik het nog steeds niet snap.

Probleem:
Methodes van andere klasse zijn alleen bereikbaar als ze worden aangeroepen vanuit de methode waarin de pointer wordt gemaakt.


Ik wil dus dat MoveListener en ChipListener bij hetzelfde object van Controller kunnen komen.

Ik probeer dat dus mee te geven d.m.v de klasse ControllerPointer.
code:
1
2
3
4
5
6
    ControllerPointer() {
        System.out.println("Pointers worden uitgevoerd");
        BJController c = new BJController();
        ChipListener cl = new ChipListener(c);
        MoveListener ml = new MoveListener(c);
    }


Om die pointer in ChipListener en MoveListener buiten de constructor scope te halen.
code:
1
2
3
4
5
6
    BJController C;

    ChipListener(BJController controller)
    {
     C = controller;
    }


Als ik in de constructor van ChipListener C.setHand() aanroep dan werkt het perfect. Ga ik buiten de constructor dan krijg ik een NPE. Hoewel ik betwijfel of dit de juiste wijze is om dit te bewerkstelligen snap ik ook niet waarom die pointer niet buiten de scope wordt gebracht.

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • woutertje
  • Registratie: maart 2002
  • Laatst online: 13:52
Heb je al met een debugger gekeken waar C naar verwijst buiten de constructor?

  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
De value van C = null. Ik heb alleen geen idee waarom die pointer niet buiten die constructor wordt gebracht.

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • Davio
  • Registratie: november 2007
  • Laatst online: 13-07 14:13
Hmm, ik gebruik in C# altijd this.object als ik een field nodig heb. Voor mijn eigen duidelijkheid en om verwarring te voorkomen.

Misschien dat zoiets in Java ook kan / moet?

  • Neverwinterx
  • Registratie: december 2005
  • Laatst online: 16:37
Waarop krijg je precies een NPE? Op de C.setHand() zelf (en dus C == null om een of andere reden) of in de code van setHand() (en dus is iets anders null om een of andere reden, analoog met je vorige topic). Toon hoe en waar je C.setHand() oproept en toon de code van setHand() en mogelijk variabelen die daarin gebruikt worden.

  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
De code van setHand is alleen nog maar een println. Het aanroepen gaat goed wanneer ik het doe vanuit de constructor.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ChipListener  implements ActionListener {
    BJController C;

    ChipListener(BJController controller)
    {
     C = controller;
    // C.setHand(); <-- dit gaat wel goed
    }


    ChipListener()
    {

    }


    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("chip10")) {
              System.out.println("10");
             C.startHand();  <----- dit gaat niet goed
            
        }



code:
1
2
3
4
5
6
7
8
9
public class BJController {


    public void startHand()
    {
        System.out.println("StartHand");
    }

}

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • DutchCommando
  • Registratie: november 2000
  • Nu online
Ik zie dat je ook een empty constructor hebt bij ChipListener. Daarnaast wordt binnen de ControllerPointer constructor enkel een lokale variabele aangemaakt welke verwijst naar een nieuwe ChipListener. Kan het zijn dat je ChipListener op een ander punt via de empty constructor instantiert?

  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
DutchCommando schreef op donderdag 30 september 2010 @ 17:29:
Ik zie dat je ook een empty constructor hebt bij ChipListener. Daarnaast wordt binnen de ControllerPointer constructor enkel een lokale variabele aangemaakt welke verwijst naar een nieuwe ChipListener. Kan het zijn dat je ChipListener op een ander punt via de empty constructor instantiert?
Dit klopt! :X Tenminste als ik het goed begrijp is dit dus het probleem

code:
1
2
3
4
5
6
7
8
9
public class MoveArea {

    JButton deal;
    JButton hit;
    JButton pass;
    JButton split;
    JButton dubble;
    JButton test;
    MoveListener ml = new MoveListener(); <----


Waarbij de pointer van ControllePointer naar een ander "MoveListerner" verwijst dan de pointer van "MoveArea". |:( Ik kan veel beter gewoon een methode maken in MoveListener die een pointer naar controller slikt.

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • DutchCommando
  • Registratie: november 2000
  • Nu online
Wat is het idee achter de ControllerPointer klasse?

  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
Om te zorgen dat de Listeners beide in dezelfde controller zitten en er niet twee controllers bestaan met verschillende waardes in hun variabelen.

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • Hydra
  • Registratie: september 2000
  • Laatst online: 18:03
Als die new MoveListener() het probleem is, waarom post je dan de source van je ChipListener constructor.

En waarom heeft, als MoveListener die controller nodig heeft, hij wel een default constructor zonder parameters?

Tenslotte: als je een exception krijgt, post dan ajb een stacktrace.

https://niels.nu


  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
Hydra schreef op donderdag 30 september 2010 @ 17:59:
Als die new MoveListener() het probleem is, waarom post je dan de source van je ChipListener constructor.

Omdat ik niet wist dat daar het probleem zat :)

En waarom heeft, als MoveListener die controller nodig heeft, hij wel een default constructor zonder parameters?

Omdat MoveArea de MoveListener ook nodig heeft.

Tenslotte: als je een exception krijgt, post dan ajb een stacktrace.

Sorry, ik weet/wist niet wat een stacktrace was, in het vervolg zal ik eraan denken. :)

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • Arie-
  • Registratie: december 2008
  • Niet online
Post 'm hier dan alsnog ;). Mijn 2 centjes, is het object waarin je C.startHand(); aanroept wel geinstantieerd door ControllerPointer? Daarmee bedoel ik dus ook: is er niet ergens een instantie van ChipListener aangemaakt zonder het BJController object, waarbij je binnen dat object die methode C.startHand() aanroept?

  • Neverwinterx
  • Registratie: december 2005
  • Laatst online: 16:37
battler schreef op donderdag 30 september 2010 @ 17:38:
[...]

Ik kan veel beter gewoon een methode maken in MoveListener die een pointer naar controller slikt.
Je kan het ook op een andere manier. Ik neem aan dat je een klasse Game of iets analoog hebt op het hoogste niveau. Die Game maakt 1 Controller object aan. Vervolgens maakt die Game het MoveListener object en ChipListener object met de constructors die een Controller slikken. En daarna set je die de MoveListener en ChipListener in respectievelijk MovesArea en ChipArea met de addActionListener of analoge methode. (En je verwijdert ControllerPointer.)

  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
@Arie: Het probleem was al opgelost maar bedankt voor je input. Je analyse is wel juist. Dit is het probleem.

MoveArea en ControllerPointer maken een pointer aan naar MoveListener.
MoveArea doet dit met een lege construct en ControllerPointer doet dit met de controller pointer. Als ik het goed begrijp bestaan er dus twee aparte MoveListener Objecten. 1 die wel toegang heeft tot de Controller en 1 die dat niet heeft. Daar komt denk ik ook die NPE vandaan. Nu is het probleem hoe maak ik dus 2 pointers naar 1 object en zorg ik dat er maar 1 object bestaat.

@NeverWinterx: Waarschijnlijk los jij het door mij hierboven geschreven probleem op. Ik ga eerst even eten en dan probeer ik het gelijk uit. Ik zie al wel dat ik wat fouten heb zitten in mijn klasse diagram want bij mij wordt de controller aangemaakt door de controllerpointer wat waarschijnlijk geen goed idee is.
http://img440.imageshack.us/img440/7371/classdiagram1.th.jpg

[Voor 29% gewijzigd door battler op 30-09-2010 19:02]

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • Hydra
  • Registratie: september 2000
  • Laatst online: 18:03
Dit is een stacktrace:
Exception in thread "main" java.lang.NullPointerException
at ArrayTest.test1(ArrayTest.java:40)
at ArrayTest.main(ArrayTest.java:9)

Hierin zie je dus duidelijk dat de main methode de test1 methode aanroept, en dat er op regel 40 een NPE optreedt. Je ziet dus waar het misgaat, en wat de aanroepende methoden zijn :)
battler schreef op donderdag 30 september 2010 @ 18:18:
@Arie: Het probleem was al opgelost maar bedankt voor je input. Je analyse is wel juist. Dit is het probleem.

MoveArea en ControllerPointer maken een pointer aan naar MoveListener.
MoveArea doet dit met een lege construct en ControllerPointer doet dit met de controller pointer. Als ik het goed begrijp bestaan er dus twee aparte MoveListener Objecten. 1 die wel toegang heeft tot de Controller en 1 die dat niet heeft. Daar komt denk ik ook die NPE vandaan. Nu is het probleem hoe maak ik dus 2 pointers naar 1 object en zorg ik dat er maar 1 object bestaat.
Als zowel MoveArea en ControllerPointer bij dezelfde MoveListener moeten kunnen, dan moet je die MoveListener aanmaken in dezelfde class als waar MoveArea en ControllerPointer aangemaakt worden. Je maakt eerst MoveListener aan, en de reference daarvan geef je zowel aan MoveArea als ControllerPointer. Verder: java heeft geen pointers maar references. En variabelen / membervariabelen begin je niet met een hoofdletter :)
@NeverWinterx: Waarschijnlijk los jij het door mij hierboven geschreven probleem op. Ik ga eerst even eten en dan probeer ik het gelijk uit. Ik zie al wel dat ik wat fouten heb zitten in mijn klasse diagram want bij mij wordt de controller aangemaakt door de controllerpointer wat waarschijnlijk geen goed idee is.

[afbeelding]
Iets groter? Je CD is onleesbaar klein.

https://niels.nu


  • battler
  • Registratie: november 2004
  • Laatst online: 07:44
CD is geupdate. Ik kan dus in de klasse "Frame" een reference maken naar Controller en die meegeven naar ChipArea en MoveArea die het op hun beurt weer doorgeven aan de listeners. Is er geen elegantere oplossing?

Spelfout gezien, let me know! dm, tel, e-mail of per post.


  • Hydra
  • Registratie: september 2000
  • Laatst online: 18:03
battler schreef op donderdag 30 september 2010 @ 19:05:
CD is geupdate. Ik kan dus in de klasse "Frame" een reference maken naar Controller en die meegeven naar ChipArea en MoveArea die het op hun beurt weer doorgeven aan de listeners. Is er geen elegantere oplossing?
Een elegantere oplossing zou een net MVC model zijn. Dat jij references door 4 classes heen moet sturen komt door je design.

Normaal heb je View componenten (panels e.d.) die luisteren naar Model events die ze weergeven. Je controller componenten luisteren naar events vanuit de view, en updaten het model indien nodig.

Oftewel
Model --> View --> Controller
....|-----------<<--------------|

Maar dat ga ik niet helemaal uitleggen, daar heb je genoeg info over op 't net :)

https://niels.nu

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee