Multithread-Arraylist-null pointer exception

florian1995

Aktives Mitglied
hallo:
Java:
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

Top Contributor
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

Aktives Mitglied
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
 

Murray

Top Contributor
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

Aktives Mitglied
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

Top Contributor
Synchronisiere doch den Teil.

P.S.: die gotos
Code:
break L;
Teile würde ich ausbauen.
 

florian1995

Aktives Mitglied
wie synchronisiert man so etwas?^^

habs gegooglet:
Java:
public synchronized void <methodenname>(){
}
NetBeans gibt mir schon beim schreiben einen fehler aus :(
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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
 

florian1995

Aktives Mitglied
lol
sry bin grad iwie verwirrt
Java:
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
 
S

SlaterB

Gast
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

Aktives Mitglied
DANKE JETZT FUNKTIONIERTS
dachte dass synchronized das gleiche ist wie
Java:
public static void main(){
new Runnable(){
public void run(){}
}
}
 

florian1995

Aktives Mitglied
na toll!
bekomme jetzt in der gleichen zeile wieder eine null pointer exception
Java:
parent.shots.get(i).move();
OBWOHL es synchronized ist!!
 
S

SlaterB

Gast
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
 
S

SlaterB

Gast
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

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben