This site requires JavaScript, please enable it in your browser!
Greenfoot back
Paya
Paya wrote ...

2018/1/20

java.lang.NullpointerException with counters

Paya Paya

2018/1/20

#
I got some problems with my counters. I know that some where the counters are not set to anything but I can't find it. Can someone help me? The first error i get is with the countCoins counter. I guess the other counters won't work as well. In Bob line 66 i get the first error.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
public class Bob extends Characters
{
    int speed = 1;
     
    int totalCoins = 20;
     
    int powerBlueEnemy = 4;
    int powerGreenEnemy = 11;
    int powerPurpleEnemy = 8;
    int powerRedEnemy = 8;
     
    private Counter blueEnergy;
    private Counter greenEnergy;
    private Counter redEnergy;
    private Counter purpleEnergy;
    private Counter countCoins;
     
    private BobTheSurvivor Level1;
     
     
    public Bob(Counter blue, Counter green, Counter red, Counter purple, Counter coins){
        blueEnergy = blue;
        greenEnergy = green;
        redEnergy = red;
        purpleEnergy = purple;
        countCoins = coins;
         
    }
 
     
    /**
     * Act - do whatever the Bob wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act()
    {
        int oldX = getX();
        int oldY = getY();
        if (Greenfoot.isKeyDown("left")){
            setLocation(getX()-speed, getY());
        }
         if (Greenfoot.isKeyDown("right")){
            setLocation(getX()+speed, getY());
        }
        if (Greenfoot.isKeyDown("up")){
            setLocation(getX(), getY()-speed);
        }
        if (Greenfoot.isKeyDown("down")){
            setLocation(getX(), getY()+speed);
        }
         
        Actor block = getOneIntersectingObject(Blocks.class);
        if (block != null){
            setLocation(oldX, oldY);
        }
        Actor door = getOneIntersectingObject(Door.class);
        if(door != null){
            setLocation(oldX, oldY);
        }
        Actor coins = getOneIntersectingObject(Coins.class);
        if (coins != null){
            countCoins.add(1);//funktioniert noch nicht
            getWorld().removeObject(coins);
        }
            
        if(countCoins.getValue() >= totalCoins){
            getWorld().removeObject(door);
        }
        Actor trophy = getOneIntersectingObject(Trophy.class);
        if (trophy != null){
            ((BobTheSurvivor)getWorld()).nextLevel();
        }
         
                 
        Actor blueDrink = getOneIntersectingObject(BlueDrink.class);
        if (blueDrink != null){
            blueEnergy.add(1);//funktioniert noch nicht
            getWorld().removeObject(blueDrink);
        }
        Actor greenDrink = getOneIntersectingObject(GreenDrink.class);
        if (greenDrink != null){
            greenEnergy.add(1);//funktioniert noch nicht
            getWorld().removeObject(greenDrink);
        }
        Actor greenDrinkx5 = getOneIntersectingObject(GreenDrinkx5.class);
        if (greenDrinkx5 != null){
            greenEnergy.add(5);//funktioniert noch nicht
            getWorld().removeObject(greenDrinkx5);
        }
        Actor purpleDrink = getOneIntersectingObject(PurpleDrink.class);
        if (purpleDrink != null){
            purpleEnergy.add(1);//funktioniert noch nicht
            getWorld().removeObject(purpleDrink);
        }
        Actor purpleDrinkx4 = getOneIntersectingObject(PurpleDrinkx4.class);
        if (purpleDrinkx4 != null){
            purpleEnergy.add(4);//funktioniert noch nicht
            getWorld().removeObject(purpleDrinkx4);
        }
        Actor redDrink = getOneIntersectingObject(RedDrink.class);
        if (redDrink != null){
            redEnergy.add(1);//funktioniert noch nicht
            getWorld().removeObject(redDrink);
        }
         
         
        Actor blueEnemy = getOneIntersectingObject(BlueEnemy.class);
        if (blueEnemy != null){
            if(blueEnergy.getValue() >= powerBlueEnemy){//funktioniert noch nicht
                getWorld().removeObject(blueEnemy);
                blueEnergy.add(-powerBlueEnemy);
                //countBlueEnergy = countBlueEnergy - powerBlueEnemy;
            }
            else{
                die();
            }
        }
        Actor greenEnemy = getOneIntersectingObject(GreenEnemy.class);
        if (greenEnemy != null){
            if(greenEnergy.getValue() >= powerGreenEnemy){//funktioniert noch nicht
                getWorld().removeObject(greenEnemy);
                greenEnergy.add(-powerGreenEnemy);
                //countGreenEnergy = countGreenEnergy - powerGreenEnemy;
            }
            else{
                die();
            }
        }
        Actor purpleEnemy = getOneIntersectingObject(PurpleEnemy.class);
        if (purpleEnemy != null){
            if(purpleEnergy.getValue() >= powerPurpleEnemy){//funktioniert noch nicht
                getWorld().removeObject(purpleEnemy);
                purpleEnergy.add(-powerPurpleEnemy);
                //countPurpleEnergy = countPurpleEnergy - powerPurpleEnemy;
            }
            else{
                die();
            }
        }
        Actor redEnemy = getOneIntersectingObject(RedEnemy.class);
        if (redEnemy != null){
            if(redEnergy.getValue() >= powerRedEnemy){//funktioniert noch nicht
                getWorld().removeObject(redEnemy);
                redEnergy.add(-powerRedEnemy);
                //countRedEnergy = countRedEnergy - powerRedEnemy;
            }
            else{
                die();
            }
        }
    }
         
    public void die(){
        ((BobTheSurvivor)getWorld()).restartThisLevel();
    }
     
}
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
public class BobTheSurvivor extends World
{
    public final int blockSize = 30;
 
    public int level = 1;
    private Counter blueEnergyCounter;
    private Counter greenEnergyCounter;
    private Counter redEnergyCounter;
    private Counter purpleEnergyCounter;
    private Counter coinsCounter;
     
    /**
     * 0 - NoObject
     * 1 - Blocks
     * 2 - Spawnpoint
     * 3 - Trophy
     * 4 - Door
     * 5 - Coins
     * 6 - RedDrink
     * 7 - GreenDrink
     * 8 - BlueDrink
     * 9 - PurpleDrink
     * 10 - RedEnemy
     * 11 - GreenEnemy
     * 12 - BlueEnemy
     * 13 - PurpleEnemy
     * 14 - PurpleDrinkx4
     * 15 - GreenDrinkx5
 
     */
 
    private int[][] Level1 = {
            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, },
            {1, 7, 0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 9, 9, 9, 1, 0, 5, 5, 1, },
            {1, 7, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 5, 1, },
            {1, 7, 0, 0, 8, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, },
            {1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 5, 0, 5, 5, 5, 1, 0, 1, 1, 1, },
            {1, 0, 7, 1, 8, 1, 0, 0, 0, 1, 5, 14, 5, 1, 1, 1, 0, 1, 5, 1, },
            {1, 7, 7, 1, 8, 1, 0, 0, 0, 1, 5, 5, 5, 1, 0, 0, 0, 1, 7, 1, },
            {1, 4, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 7, 1, },
            {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 7, 1, },
            {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 1, 1, 1, },
            {1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, },
            {1, 0, 0, 0, 0, 3, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, },
            {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, },
            {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 1, 6, 1, },
            {1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 5, 1, 0, 0, 1, 1, 1, 6, 1, },
            {1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 1, 1, 1, 0, 0, 1, 6, 6, 6, 1, },
            {1, 0, 0, 0, 1, 5, 0, 5, 1, 0, 1, 0, 0, 0, 0, 1, 6, 6, 6, 1, },
            {1, 0, 0, 0, 1, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, },
            {1, 0, 2, 0, 1, 5, 0, 5, 0, 0, 0, 7, 7, 1, 11, 0, 0, 0, 5, 1, },
            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, },
        };
 
    public BobTheSurvivor()
    {
        super(20, 20, 30);
         
        generateLevel(level);
        //Neu für Counters
        blueEnergyCounter = new Counter ("Blue Energy: ");
        addObject(blueEnergyCounter, 2, 20);
         
        redEnergyCounter = new Counter ("Red Energy: ");
        addObject(redEnergyCounter, 12, 20);
         
        greenEnergyCounter = new Counter ("Green Energy: ");
        addObject(greenEnergyCounter, 7, 20);
         
        purpleEnergyCounter = new Counter ("Purple Energy: ");
        addObject(purpleEnergyCounter, 17, 20);
         
        coinsCounter = new Counter ("Coins: ");
        addObject(coinsCounter, 1, 0);
         
         
    }
    public void nextLevel(){
        level++;
        changeLevel(level);
        generateLevel(level);
    }
 
    public void restartThisLevel(){
        generateLevel(level);
    }
 
    private void generateLevel(int level){
        removeObjects(getObjects(null));
        
        for (int i = 0; i < 20; i++){
            for (int j = 0; j < 20; j++){
                int aNumber = Level1[j][i];
 
                if (aNumber == 1){
                    addObject (new Blocks(), i, j);                   
                }
                else if (aNumber == 2){
                    addObject (new Bob(blueEnergyCounter, greenEnergyCounter, redEnergyCounter, purpleEnergyCounter, coinsCounter), i, j);
                }
CxVercility CxVercility

2018/1/20

#
Ho-ly Sh-it Hat er nicht gemacht. Du kannst doch nicht einfach 5 mal den selben code kopieren und eine Sache dran ändern ahahaha. Räum erstmal deinen code etwas auf. Für Vorgänge die derselben richtlinie folgen benutz eine Hilfsmethode und übergib ihr ein Objekt dass hilft zu identifizieren in welchem Fall du dich befindest (z.b welche farbe der drink hat), und ruf stattdessen die methode in act() auf. Besonders lange if ketten wie dein Bewegungs-checken gehören auch in hilfsmethoden, dein Code ist mega unübersichtlich und es kostet dich wahrscheinlich 10mal soviel zeit den Fehler zu finden wie sonst (Weswegen ich das auch jetzt erstmal nicht tue) Wenn du dabei Probleme hast, schreib gerne nochmal. Edit : Nevermind, denke ich hab den Fehler Gefunden. Du initialisierst zwar coinsCounter als new Counter, aber ich vermute mal dass innerhalb dieses Counters der coinValue durch den new Konstruktor uninitialisiert bleibt. Daher der Nullpointer, der Wert existiert noch nicht. Abhilfe würde dass 0-setzen zu beginn bringen, sprich coinsCounter.setCoins(0) oder sowas. Könnte mich aber auch irren, ich benutze greenfoot selber nicht und kenne daher die Counter Klasse nicht.
Super_Hippo Super_Hippo

2018/1/20

#
You add Bob before you create the counters, so the variables in Bob stay null. Move line 59 (world) to the end of the method (76).
CxVercility CxVercility

2018/1/20

#
Super_Hippo wrote...
You add Bob before you create the counters, so the variables in Bob stay null. Move line 59 (world) to the end of the method (76).
Good Point. Ignore my Edit in this case.
Paya Paya

2018/1/21

#
Super_Hippo wrote...
You add Bob before you create the counters, so the variables in Bob stay null. Move line 59 (world) to the end of the method (76).
Doesn't work unfortunately. If I move this line my counters are not displayed in the game... Edit: I got it. It works if I create the counters before generating the level and add them after. Thank you both!
Paya Paya

2018/1/21

#
@CxVercility kannst du mir ein kleines Beispiel geben wie du den Bewegungscheck machen würdest? Bin noch nicht so geübt im Programmieren und der Code ist echt nicht so übersichtlich..
CxVercility CxVercility

2018/1/21

#
Paya wrote...
@CxVercility kannst du mir ein kleines Beispiel geben wie du den Bewegungscheck machen würdest? Bin noch nicht so geübt im Programmieren und der Code ist echt nicht so übersichtlich..
Hey. Du schiebst einfach den ganzen Code in eine hilfsmethode und rufst stattdessen dann einfach die Methode auf :)
CxVercility CxVercility

2018/1/21

#
CxVercility wrote...
Paya wrote...
@CxVercility kannst du mir ein kleines Beispiel geben wie du den Bewegungscheck machen würdest? Bin noch nicht so geübt im Programmieren und der Code ist echt nicht so übersichtlich..
Hey. Du schiebst einfach den ganzen Code in eine hilfsmethode und rufst stattdessen dann einfach die Methode auf :)
1
2
3
4
5
6
7
public void act() {
bewegung() ;
}
 
public void Bewegung() {
.....
}
Paya Paya

2018/1/21

#
ach soo!!! mein kopf xD Danke !
CxVercility CxVercility

2018/1/21

#
Paya wrote...
ach soo!!! mein kopf xD Danke !
Vergiss nicht dass du das gleiche natürlich auch mit den drinks/gegnern machen kannst In dem Fall ist es minimal komplizierter, aber das dürftest du auch rausfinden. Wenn nicht, schreib was du versucht hast oder woran du hängen bleibst und ich helf dir^^
Super_Hippo Super_Hippo

2018/1/21

#
Du brauchst sicher auch nicht für jeden Drink eine eigene Klasse erstellen.
CxVercility CxVercility

2018/1/21

#
Super_Hippo wrote...
Du brauchst sicher auch nicht für jeden Drink eine eigene Klasse erstellen.
Guter punkt eigentlich, das ist mir noch gar nicht aufgefallen haha. Variable in der Klasse für farbe sollte reichen
You need to login to post a reply.