注册 登录
编程论坛 JAVA论坛

老是空指针异常,改了好些遍,都没成功,大家帮我看一下吧

jjyy9822 发布于 2016-06-24 21:39, 2781 次点击


import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Demo extends JFrame {
    MyJPanel myPanel;
   
    public static void main(String[] args) {
        Demo demo = new Demo();
    }
   
    public Demo(){
        myPanel = new MyJPanel();
        //System.out.println(myPanel);
        this.add(myPanel);
        MyListener listener = new MyListener(myPanel);
        this.addKeyListener(listener);
        this.setSize(400,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}

class MyJPanel extends JPanel{
    int x = 10;
    int y = 10;
    int speed = 1;
   
    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getX() {
        return x;
    }
   
    public void setX(int x) {
        this.x = x;
    }
   
    public int getY() {
        return y;
    }
   
    public void setY(int y) {
        this.y = y;
    }
   
   
    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(x,y,10,10);
    }
}

class MyListener implements KeyListener{
   
    MyJPanel myPanel;
   
        //此处报告空指针异常
    int x = myPanel.getX();
    int y = myPanel.getY();
   
    int speed = myPanel.getSpeed();
   
    public MyListener(){
        
    }
   
    public MyListener(MyJPanel myPanel){
        this.myPanel = myPanel;
    }
   
    public void keyTyped(KeyEvent e) {
        
    }

   
    public void keyPressed(KeyEvent e) {
        
        if (e.getKeyCode() == KeyEvent.VK_W) {
            myPanel.setY(y - speed);
        } else if (e.getKeyCode() == KeyEvent.VK_S) {
            myPanel.setY(y + speed);
        } else if (e.getKeyCode() == KeyEvent.VK_A) {
            myPanel.setX(x - speed);
        } else if (e.getKeyCode() == KeyEvent.VK_D) {
            myPanel.setX(x + speed);
        }
        myPanel.repaint();
        
    }

   
    public void keyReleased(KeyEvent e) {
        
    }
   
}



备注那里为什么会出现空指针异常  求大神帮忙解决
5 回复
#2
jjyy98222016-06-24 21:43
Exception in thread "main" java.lang.NullPointerException
    at cn.itcast_02.MyListener.<init>(Demo.java:70)
    at cn.itcast_02.Demo.<init>(Demo.java:21)
    at cn.itcast_02.Demo.main(Demo.java:14)

#3
dc小菜鸟2016-07-15 18:20
在你注释的地方你是声明了一个 myPanel变量,但是你没有给这个变量赋一个对象,这个变量的引用就是null,所以会报exception。你可以把 myPanel打印出来看看是不是null

[此贴子已经被作者于2016-7-15 18:23编辑过]

#4
平常心q2016-07-15 20:23
MyListener listener = new MyListener(myPanel);
this.addKeyListener();

这两行代码有问题,注释后,不会报错,但按键就有问题了。这说明按键有问题
#5
Joss2016-07-15 22:23
回复 2楼 jjyy9822
package demo01;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test01 extends JFrame {
    MyJPanel myPanel;
   
    public static void main(String[] args) {
        Test01 demo = new Test01();
    }
   
    public Test01(){
        myPanel = new MyJPanel();
        //System.out.println(myPanel);
        this.add(myPanel);
        MyListener listener = new MyListener(this.myPanel);
        this.addKeyListener(listener);
        this.setSize(400,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}

class MyJPanel extends JPanel{
    int x = 10;
    int y = 10;
    int speed = 1;
   
    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getX() {
        return x;
    }
   
    public void setX(int x) {
        this.x = x;
    }
   
    public int getY() {
        return y;
    }
   
    public void setY(int y) {
        this.y = y;
    }
   
   
    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(x,y,10,10);
    }
}

class MyListener implements KeyListener{
   
    MyJPanel myPanel ;
   
        //此处报告空指针异常
   /* int x = myPanel.getX();
    int y = myPanel.getY();*/
    int x;
    int y;
    int speed;

    //int speed = myPanel.getSpeed();
   
    public MyListener(){
        
    }
   //修改之后
    public MyListener(MyJPanel myPanel){
        this.myPanel = myPanel;
        x = myPanel.getX();
        y = myPanel.getY();
        speed = myPanel.getSpeed();

    }
   
    public void keyTyped(KeyEvent e) {
        
    }

   
    public void keyPressed(KeyEvent e) {
        
        if (e.getKeyCode() == KeyEvent.VK_W) {
            myPanel.setY(y - speed -10);
        } else if (e.getKeyCode() == KeyEvent.VK_S) {
            myPanel.setY(y + speed  +10);
        } else if (e.getKeyCode() == KeyEvent.VK_A) {
            myPanel.setX(x - speed-10);
        } else if (e.getKeyCode() == KeyEvent.VK_D) {
            myPanel.setX(x + speed +10);
        }
        myPanel.repaint();
        
    }

   
    public void keyReleased(KeyEvent e) {
        
    }
   
}

这样修改可以运行
#6
stm322017-04-30 21:14
1