Błąd java.lang.NullPointerException co kilka uruchomień programu.

Błąd java.lang.NullPointerException co kilka uruchomień programu.
NN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Witam,
w mojej aplikacji mam Timer, który przesuwa obrazek i chcę napisać "kolizję", czyli jeśli najedzie na inny obrazek, to wykonaj to i to...
Kod kolizji jest ok, bo sprawdzałem bez Timera itd..

Z tego co wyczytałem to problem "java.lang.NullPointerException", występuje, gdy chcemy się dostać do "nullowego" obiektu, jeśli dobrze to rozumiem.

Problem ten pojawia się losowo, nie raz wszystko działa jak powinno, a po np. trzecim uruchomieniu wywala błąd.

Kompilator informuje mnie, że błąd jest w ifie (wiem, że jest on dość zawiły), ale chyba nie tutaj problem.
Podejrzewam, że problem leży w tablicy brick[], jednak nie wiem gdzie on jest.

Kod tworzenia tablicy:
(Drawer to funkcja rysująca)

Kopiuj
 

Drawer brick[]= new Drawer[12]; 
for(int i=0; i<brick.length; i++)
		brick[i]=new Drawer("brick");    // każdy element, uzupełniam obrazkiem "brick"

Kod kolizji, gdzie wykorzystuje tablicę.

Kopiuj
 

for(int i=0; i<brick.length;i++)
				{
					
						if(  brick[i].name()=="brick" &&
								 go.getX()+go.getWidth()+5>=brick[i].getX()-1 && 
								go.getX()+go.getWidth()<=brick[i].getX()-1  &&
								 (( go.getY()>=brick[i].getY() && 
								go.getY()<=brick[i].getY()+brick[i].getHeight()) ||
							  ( go.getY()+44>=brick[i].getY()  && 
							go.getY()+44<=brick[i].getY()
									+brick[i].getHeight())))
						{
							go.setVisible(false);
							brick[i].im("background");
						}
								
							
					}
				}

Tutaj błąd:

Kopiuj
Exception in thread "Timer-4" java.lang.NullPointerException
	at Form$ReOpBall.run(Form.java:602)
	at java.util.TimerThread.mainLoop(Unknown Source)
	at java.util.TimerThread.run(Unknown Source)

Dzięki za wszelkie porady ;)

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Spal ten kod i napisz od nowa bo to jest mega WTF. Błąd wskazuje na to że najpewniej go jest niezainicjalizowaną zmienną. Ale tak generalnie to cały ten if jest bez sensu. Pokaż go swojej mamie i spytaj czy rozumie o co chodzi. Jesli nie rozumie to jest źle napisany. Co więcej, idę o zakład że za tydzień ty sam nie będziesz go rozumiał...

NN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Żarciki widzę super ;)
Dlatego ten temat jest w newbie, bo jestem newbie i takie też pytania zadaje...

Tak tworze "go",

Kopiuj
Drawer go=new Drawer("go");

Jakieś rady?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Radę juz dostałeś. Skasuj i napisz od nowa. Tym razem myśląc i pisząc to w sposób czytelny. A oprócz tego to zapnij się debugerem i przechodź kod step-by-step aż trafisz na problem.

NN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

A jak lepiej okodować taką "kolizję"?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Ech. Popatrz na swój kod i na przykład na kod taki:

Kopiuj
class Brick{

    public boolean collision(Brick another){
        return leftCollision(another) || rightCollision(another) || topCollision(another) || bottomCollision(another);
    }
}

Widzisz różnicę między moim a twoim kodem? Mój da sie przeczytać i wiadomo od razu co robi. Twojego się nie da. Dalej te poszczególne kolizje też zapisujesz w sensowny sposób. Efekt jest taki ze w twoim kodzie trudno sie połapać i nawet gdybyś miał tam gdzieś błąd w stylu && zamiast || to go nie zauważysz.

NN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

No ok i super, zaraz tak zrobię.
Tylko, że to raczej nie rozwiąże mojego problemu z błędem.

A czy coś takiego jest poprawne?

Kopiuj
for(int i=0; i<brick.length; i++)
add(brick[i]);

Chodzi mi o takie dodawanie elementów do panela, czy gdziekolwiek.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.