# Multithread-Arraylist-null pointer exception



## florian1995 (5. Sep 2010)

hallo:

```
L:
            for(int i=0;i<starship.size();i++){
                if(starship.get(i).isOutOfScreen(parent.getPreferredSize().height)||  (starship.get(i).rectangle.intersects(parent.player.rectangle)&&counter%200==0)){
                    starship.remove(i);
                    parent.player.decreaseLife(1);
                } else
                for(int j=0;j<shots.size();j++){
                    //zeile 39 null pointer exception
                    if(starship.get(i).rectangle.intersects(parent.shots.get(j).rectangle)){
                        starship.get(i).decreaseLife(Player.damage);
                        if(starship.get(i).isDestroyed()){
                            parent.player.bonusPoints(starship.get(i).bonusPoints);
                            starship.remove(i);
                        }
                        shots.remove(j);
                        break L;
                    }
                }
            }
```

habe das problem das ich nach einer weile immer eine null pointer exception bekomme. 
starship,shots sind arraylists
das dürfte eigentlich nicht sein oder?


----------



## XHelp (5. Sep 2010)

Was heißt "nach einer Weile" 
[EDIT]
und wo fliegt die Exception?... schon gut, habs gesehen
[/EDIT]

Versuch doch abzufragen ob das nicht null ist, dann weißt was genau da los ist.


----------



## florian1995 (5. Sep 2010)

habs mit if gemacht.
weder starship.get(i).rectangle noch shots.get(i).rectangle geben null zurück
also muss der fehler in intersects() liegen.
nur das ich das nicht abfragen kann


----------



## XHelp (5. Sep 2010)

Und 
	
	
	
	





```
parent.shots.get(j).rectangle
```
?


----------



## Murray (5. Sep 2010)

Im Titel erwähnst Du ja bereits "Mutlithread" - besteht die Möglichkeit, dass ein anderer Thread Elemente aus einer der beiden Listen auf "null" setzt?


----------



## florian1995 (6. Sep 2010)

es besteht die möglickeit das ein element removed wird. 
wie kann ich in diesem augenblick nur den einen thread laufen lassen und alle anderen stoppen?


----------



## fastjack (6. Sep 2010)

Synchronisiere doch den Teil. 

P.S.: die gotos 
	
	
	
	





```
break L;
```
 Teile würde ich ausbauen.


----------



## florian1995 (6. Sep 2010)

wie synchronisiert man so etwas?^^

habs gegooglet:

```
public synchronized void <methodenname>(){
}
```
NetBeans gibt mir schon beim schreiben einen fehler aus


----------



## SlaterB (6. Sep 2010)

stell dir vor Netbeans würde 'ein Fehler' ausgeben statt die exakte Fehlermeldung
dann würdest du dich so fühlen wie jetzt jeder andere von dir informiert ist


----------



## Marco13 (6. Sep 2010)

:toll:


----------



## florian1995 (6. Sep 2010)

xD gut gesagt!!
aber "Illegal start of Expression" wird dir auch nicht viel helfen


----------



## SlaterB (6. Sep 2010)

gut, Zusammenhang zu längerem Code-Ausschnitt wäre auch noch nützlich


----------



## florian1995 (6. Sep 2010)

lol
sry bin grad iwie verwirrt

```
public void run(){
        int counter=0;
        while(true){
            for(int i=0;i<parent.starship.size();i++){
                if(parent.starship.get(i).isOutOfScreen(parent.getPreferredSize().height)||(parent.starship.get(i).rectangle.intersects(parent.player.rectangle)&&counter%200==0)){
                    parent.starship.remove(i);
                    parent.player.decreaseLife(1);
                } else
                    public 
                    synchronized 
                            void Collision(){
                        //synchronisieren
                    for(int j=0;j<parent.shots.size();j++){
                    //zeile 39 null pointer exception
                    if(parent.shots.get(j).isOutOfScreen()){
                        parent.shots.remove(j);
                    }
                    try{
                        if(parent.starship.get(i).rectangle.intersects(parent.shots.get(j).rectangle)){
                        parent.starship.get(i).decreaseLife(Player.damage);
                        if(parent.starship.get(i).isDestroyed()){
                            parent.player.bonusPoints(parent.starship.get(i).bonusPoints);
                            parent.starship.remove(i);
                        }
                        parent.shots.remove(j);
                        }
                    }catch(Exception e){

                    }
                }
                //--
                    }
                
            }
            if(parent.player.gameOver()){
                parent.warning="GAME OVER! You gained "+parent.player.sumPoints+" Points";
                parent.player.restart=true;
                System.exit(5000);
            }
            try{
                Thread.sleep(1);
            }catch(Exception e){
                System.out.print(e);
            }
            counter++;
            parent.repaint();
        }

    }
```
in zeile 9 kommt der fehler


----------



## SlaterB (6. Sep 2010)

von
> public synchronized void <methodenname>(){
zu
> public  synchronized void Collision(){

darf man doch annehmen dass du erkannt hast, dass das eine Methoden-Deklaration ist?
und Methoden innerhalb von anderen Methoden ist schlecht, bekannt?

puh, unter solchen Umständen solltest du dich für Monate auf keinen Fall mit Threads oder synchronized beschäftigen,
oder wenn es sein muss eben das entsprechende Kapitel von Anfang an lesen:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11 Threads und nebenläufige Programmierung
vorher aber besser alle unteren Kapitel..


----------



## florian1995 (6. Sep 2010)

DANKE JETZT FUNKTIONIERTS
dachte dass synchronized das gleiche ist wie

```
public static void main(){
new Runnable(){
public void run(){}
}
}
```


----------



## florian1995 (6. Sep 2010)

na toll!
bekomme jetzt in der gleichen zeile wieder eine null pointer exception 

```
parent.shots.get(i).move();
```
OBWOHL es synchronized ist!!


----------



## SlaterB (6. Sep 2010)

synchronized ist kein Allheilmittel, das jedes Programm automatisch richtig macht, 
nur mit Kenntnis an der richtigen Stelle eingesetzt kann es etwas bewirken, muss aber nicht


----------



## florian1995 (6. Sep 2010)

schade. mein spiel stürzt immer an der gleichen stelle wegen einer null pointer exception ab ...


----------



## XHelp (6. Sep 2010)

Weißt du denn was genau null ist?


----------



## SlaterB (6. Sep 2010)

aus meiner Sicht sinnvoll wäre, herauszufinden, woran es liegt,
logge mit System.out.println() alle beteiligten Objekte in der Zeile davor,

ist parent null? ist parent.shots null? ist parent.shots.get(i) null?
dann schaue an, warum das so ist, wer setzt je die entsprechenden Variablen auf null, vielleicht in anderen Programmteilen, wer fügt null in die Liste hinzu

letztendlich kann man dann versuchen, die problematischen gleichzeitigen Aktionen zu synchronisieren,
aber das muss dann allen beteiligten Stellen passieren, neben einem noch nicht vorhanden Verständnis zur Snychronisierung setzt das auch ein Verständnis des Programms voraus


----------



## Blakh (10. Sep 2010)

Hallo...

wenns noch aktuell ist:

java.util.concurrent.CopyOnWriteArrayList

_A thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array. 
_

Oder verwende Vektoren ... 

Vllt. hilft dir das bei deinem Problem mit der ArrayList und mehreren Threads.

mfg


----------

