|
| Mystisk nullPointerException Fra : Kristian |
Dato : 14-03-02 16:09 |
|
Hej gruppe
Jeg har et mindre problem med et lille projekt, jeg har kørende - jeg
skal
lave et spil a la Arkanoid, men allerede i de indledende manøvrer går det
galt... Here goes:
Jeg tegner en JFrame og lægger et JPanel på i form af et sort rektangel.
Nu
vil jeg gerne flytte rektanglet til siden vha. piletasterne, men når jeg
forsøger at kalde en metode, når KeyListeneren bliver invoket, så får jeg
en
NullPointerException. Er der ikke en venlig sjæl, der kan forklare mig,
hvor
filmen knækker, for jeg er helt ærligt på meget bar bund. Tilsyneladende
er
der ikke scope til de variabler, jeg skal bruge - men jeg synes da, det
ser
meget godt ud *s*.
På forhånd mange tak - Kristian
P.S. - Nullpointeren kommer i den switch, jeg har lavet i min KeyListener
-
omkring linie 40.
****************************************************************
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class Run
{
public static void main(String[] args)
{
new Pad();
}
}
class Pad
{
public Pad()
{
JFrame frame = new JFrame();
Canvas canvas = new Canvas();
frame.setSize(frameSizeX, frameSizeY);
frame.getContentPane().add("Center", canvas);
frame.addKeyListener( new KeyListener()
{
public void actionPerformed (KeyEvent event)
{
}
public void keyTyped (KeyEvent parm1)
{
}
public void keyPressed (KeyEvent parm1)
{
switch (parm1.getKeyCode())
{
case 37: b.move(++x); break; //37 = pil-venstre
case 39: System.out.println ("39"); break; //39 = pil-højre
default :
}
}
public void keyReleased (KeyEvent parm1)
{
}
});
frame.show();
}
private Bat b = null;
private int x = 200;
private int frameSizeX = 400;
private int frameSizeY = 400;
}
class Canvas extends JPanel
{
public Canvas()
{
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
b.draw(g2);
}
Bat b = new Bat();
}
class Bat
{
public Bat()
{
}
public void draw(Graphics2D g2)
{
g2.fill(new RoundRectangle2D.Double(x, y, batSizeX, batSizeY, 5, 5));
}
//præ: x > 0
//post: Battets nye position er tegnet på framen
public void move(int newX)
{
x = newX;
//render battets nye position vha det nye X-koordinat
System.out.println ("Move");
}
private int x = 200;
private int y = 350;
private int batSizeX = 70;
private int batSizeY = 10;
}
| |
Flemming Jensen (14-03-2002)
| Kommentar Fra : Flemming Jensen |
Dato : 14-03-02 16:54 |
|
On 14 Mar 2002 15:09:27 GMT, Kristian <erbou@hotmail.com> wrote:
Jeg tror dit problem ligger i hvor du vil have dit reference
til dit Bat, Du instantierer den i Canvas, men vil åbenbart også
have en reference til den i Pad. Den sidste sætter du til null, og
den bliver aldrig andet. Det er "b.move..." der giver en NullPointer-
Excpetion fordi Bat b netop er null.
/Flemming Jensen
>Hej gruppe
>
>Jeg har et mindre problem med et lille projekt, jeg har kørende - jeg
>skal
>lave et spil a la Arkanoid, men allerede i de indledende manøvrer går det
>galt... Here goes:
>
| |
JN (14-03-2002)
| Kommentar Fra : JN |
Dato : 14-03-02 16:56 |
|
Kristian wrote:
> Hej gruppe
>
> Jeg har et mindre problem med et lille projekt, jeg har kørende - jeg
> skal
> lave et spil a la Arkanoid, men allerede i de indledende manøvrer går det
> galt... Here goes:
>
> Jeg tegner en JFrame og lægger et JPanel på i form af et sort rektangel.
> Nu
> vil jeg gerne flytte rektanglet til siden vha. piletasterne, men når jeg
> forsøger at kalde en metode, når KeyListeneren bliver invoket, så får jeg
> en
> NullPointerException. Er der ikke en venlig sjæl, der kan forklare mig,
> hvor
> filmen knækker, for jeg er helt ærligt på meget bar bund. Tilsyneladende
> er
> der ikke scope til de variabler, jeg skal bruge - men jeg synes da, det
> ser
> meget godt ud *s*.
>
Hvori består mystikken?
b = null i class Pad.
I Pad referer b til den lokale instans.
> På forhånd mange tak - Kristian
>
> P.S. - Nullpointeren kommer i den switch, jeg har lavet i min KeyListener
> -
> omkring linie 40.
>
> ****************************************************************
>
>
> import java.awt.*;
> import java.awt.event.*;
> import java.awt.geom.*;
> import javax.swing.*;
>
> public class Run
> {
> public static void main(String[] args)
> {
> new Pad();
> }
> }
>
> class Pad
> {
> public Pad()
> {
> JFrame frame = new JFrame();
> Canvas canvas = new Canvas();
> frame.setSize(frameSizeX, frameSizeY);
> frame.getContentPane().add("Center", canvas);
>
> frame.addKeyListener( new KeyListener()
> {
> public void actionPerformed (KeyEvent event)
> {
> }
> public void keyTyped (KeyEvent parm1)
> {
> }
> public void keyPressed (KeyEvent parm1)
> {
> switch (parm1.getKeyCode())
> {
> case 37: b.move(++x); break; //37 = pil-venstre
> case 39: System.out.println ("39"); break; //39 = pil-højre
> default :
> }
> }
> public void keyReleased (KeyEvent parm1)
> {
> }
> });
>
> frame.show();
> }
>
> private Bat b = null;
> private int x = 200;
> private int frameSizeX = 400;
> private int frameSizeY = 400;
> }
>
>
> class Canvas extends JPanel
> {
> public Canvas()
> {
> }
>
> public void paintComponent(Graphics g)
> {
> super.paintComponent(g);
> Graphics2D g2 = (Graphics2D)g;
> b.draw(g2);
> }
>
> Bat b = new Bat();
> }
>
>
> class Bat
> {
> public Bat()
> {
> }
>
> public void draw(Graphics2D g2)
> {
> g2.fill(new RoundRectangle2D.Double(x, y, batSizeX, batSizeY, 5, 5));
> }
>
> //præ: x > 0
> //post: Battets nye position er tegnet på framen
> public void move(int newX)
> {
> x = newX;
> //render battets nye position vha det nye X-koordinat
> System.out.println ("Move");
> }
>
> private int x = 200;
> private int y = 350;
> private int batSizeX = 70;
> private int batSizeY = 10;
>
> }
>
| |
Flemming Jensen (14-03-2002)
| Kommentar Fra : Flemming Jensen |
Dato : 14-03-02 17:13 |
|
On 14 Mar 2002 15:09:27 GMT, Kristian <erbou@hotmail.com> wrote:
>Hej gruppe
>
>... jeg skal lave et spil a la Arkanoid, ...
Forøvrigt - hvis de gerne vil til at rode med spil i Java
skulle du måske prøve at se på den nye Full-Screen Exclusive
Mode API, der er kommet i J2SDK 1.4
Jeg leger selv lidt med den. Den giver mulighed for at overtage
hele skærmen, ændre opløsning etc. Det går hurtigere end i
et vindue, selv om det naturligvis ikke er så hurtigt som
DirectX ol.
/Flemming Jensen
| |
|
|