NullPointerException når jeg kalder min custom paintBG(Graphics g)

Tags:    java swing

Hej alle! Har et problem med min kode, får NullPointerException..

Får min fejl i den her linje:
Fold kodeboks ind/udJava kode 


Får dette output:
Fold kodeboks ind/udKode 


Her er al min kode:

Window.java
Fold kodeboks ind/udJava kode 


Panel.java
Fold kodeboks ind/udJava kode 


Keylistener.java
Fold kodeboks ind/udJava kode 




Indlæg senest redigeret d. 19.01.2013 12:28 af Bruger #16945
8 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Du har kommenteret linje 40 i Window.java så g bliver aldrig initialiseret.



Det er jo fordi du først initialiserer panelet på linjen bagefter:

Fold kodeboks ind/udJava kode 


Når du får en NullPointerException skyldes det næsten altid at du bruger en variabel du har glemt at initialisere. En strategi for at finde fejlen er at finde linjen du får problemet på. F.eks. fra før:
Fold kodeboks ind/udJava kode 

Det er ikke fordi du sender en null værdi med til drawImage du fik fejlen for så ville fejlen komme inde i drawImage. I stedet er det fordi du prøver at læse en null værdi. Så det kan kun være 'window' eller 'g'. Ved at "følge programmet tilbage" kan man så finde synderen.



Indlæg senest redigeret d. 19.01.2013 13:15 af Bruger #14645
Har lige læst lidt rundt og det anbefales ikke at man bruger getGraphics uden for tegnemetoderne. Siden du kalder getGraphics i constructoren på Window er det ikke sikkert at Window eller Panel er synlige endnu. Så kan getGraphics godt returnere null. Graphic's objektet den giver dig har også et kort liv, som du forlænger ved at have en reference til den 'g'. Men efter noget tid vil ting der bliver tegnet på den ikke længere have nogen virkning.

I stedet anbefales det at du overrider paintComponent og tegner derfra i stedet (den skal du ikke selv kalde, det gør Swing for dig):
http://stackoverflow.com/questions/5446396/javax-swing-jpanel-paintcomponent

Husk at kalde super.paintComponent(g);

Hvis du gør det på denne måde vil den automatisk gentegne sig selv når du flytter på vinduet eller resizer.



Indlæg senest redigeret d. 19.01.2013 13:56 af Bruger #14645
Når ja, da jeg prøvede at rette koden udkommenterede jeg og lavede paintBG(Graphics g) om til default paint(Graphics g)... - Når jeg fjerne kommenteringen, får jeg dette output:

Exception in thread "main" java.lang.NullPointerException
at Window.<init>(Window.java:40)
at Window.main(Window.java:102)


Får ikke engang skrevet Hello Woindow ud...



Aaaarh, ja selvfølgelig! :-) - Har rettet den fejl, men min kode et tydeligvis ikke særlig god, for får bare en ny fejl :S

Fold kodeboks ind/udKode 


Nu kan den eksekvere koden ned til linje 66 i Window klassen, får fejl ved panel.paintBG(g);.. NullPointerException igen..

Overvejede om det måske kunne være fordi jeg gav den g.drawImage() en null værdi med som parameter, men det er ikke derfor, for jeg har brugt præcis samme kode før, altså g.drawImage(window.bg, 1, 1 null); i en tidligere version af min kode.. Har også initialiseret billederne før jeg kører paintBG(g) metoden, så det kan ikke være der jeg får NullPointerException.. Kan ikke finde ud af hvor jeg prøver at læse en null værdi.. Har tjekket om den fejler ved init af billederne, men det gør den ikke..



Hmm ved ikke om vi ser det samme kode eller linjenumre længere.



Okay opdaterer lige min kode :P

Window.java
Fold kodeboks ind/udJava kode 


Panel.java
Fold kodeboks ind/udJava kode 


Keylistener.java
Fold kodeboks ind/udJava kode 


Her er mit output
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 19.01.2013 13:39 af Bruger #16945
Okay fik det til at virke, men var desværre lidt doven.. Det blev for besværligt med et JPanel, så har bare valgt at ligge billederne direkte på JFramet...

- Ellers mange tak! Det var nogle gode svar :P



t