线程 "AWT-EventQueue-0"java.lang.NullPointerException 中的 Java 异常

标签 java swing nullpointerexception jpanel paintcomponent

<分区>

好的,我在这里尝试做的是创建一个游戏,其中通过用鼠标单击对象并向后拉鼠标来控制对象/球(鼠标向后拉的距离将决定对象的速度) 并在释放按钮时对象将移动(它的移动角度也将由鼠标向后拉的角度决定)

现在,据我所知,“数学”至少应该可以工作,不幸的是,我无法测试它,因为我遇到了以下错误。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Snail.moveUp(Snail.java:35)
at Snail.chill(Snail.java:20)
at Level.mouseReleased(Level.java:120)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

据我所知,这意味着我可能已经声明了一些具有空值的东西,但这让我感到困惑,因为我已经完成了所有变量的打印输出,并且所有变量都在赋值。

然后我假设我可能在声明值之前告诉对象移动,但我无法弄清楚为什么会发生这种情况。

我的代码如下。

import java.awt.*;
import java.awt.event.*;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.event.MouseInputListener;

@SuppressWarnings("serial")
public class Level extends JPanel implements ActionListener, MouseInputListener{

Timer time;
private Image i;
private Graphics doubleG;
Snail s, s2;

boolean canJump;
int sx2;
int sy2;
int sx3;
int sy3;
double clickX;
double clickY;
double relX;
double relY;
double angle;
double speed;
double distance;

double scalex;
double scaley;
double velocityx = 1;
double velocityy = 1;

public Level(){

    s = new Snail();
    setFocusable(true);

    addMouseListener(this);
    addMouseMotionListener(this);
    //s2 = new Snail(250, 250);
    time = new Timer(17, this);
    time.start();   
}

@Override //double buffer
    public void update(Graphics g) {
        super.update(g);
            if(i == null){
                i = createImage(this.getSize().width, this.getSize().height);
                doubleG = i.getGraphics();
            }

            doubleG.setColor(getBackground());
            doubleG.fillRect(0, 0, this.getSize().width, this.getSize().height);

            doubleG.setColor(getForeground());
            paint(doubleG);

            g.drawImage(i, 0, 0, this);
    }

public void actionPerformed(ActionEvent e){
    s.update(this);
    //s2.update(this);
    repaint();


}

public void paintComponent (Graphics g) {   super.paintComponent(g); 
    s.paint(g);
    //s2.paint(g);

}

@Override
public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent ep) {
    clickX = ep.getX();
    clickY = ep.getY();
}

@Override
public void mouseReleased(MouseEvent er) {
    relX = er.getX();
    relY = er.getY();
    angle = Math.toRadians(Math.atan2(clickY - relY, clickX - relX));

    distance = Math.hypot(relX-clickX, relY-clickY);
    speed = distance/8;

    scalex = Math.cos(angle);
    scaley = Math.sin(angle);
    velocityx = speed * scalex;
    velocityy = speed * scaley;

    if (speed > 20){
        speed = 20;
    }

    if (canJump) {s.moveUp();

    }

}

@Override
public void mouseDragged(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseMoved(MouseEvent em) {
    sx2 = s.x - s.radius;
    sy2 = s.y + s.radius;
    sx3 = s.x + s.radius;
    sy3 = s.y - s.radius;

    if (em.getX() >= sx2 && em.getX() <= sx3 && em.getY() >= sy3 && em.getY() <= sy2){
        canJump = true;
    }else{
        canJump = false;
    }
    System.out.println("Click   X " + clickX + " Click   Y " + clickY);
    System.out.println("Release X " + relX + " Release Y " + relY);
    System.out.println("angle" + angle);
    System.out.println("distance" + distance);
    System.out.println("velx " + velocityx);
    System.out.println("vely " + velocityy);
    System.out.println(scalex);
    System.out.println(scaley);
    System.out.println(" ");

}

}

这将是第二个似乎发生错误的类,我正在调用上面类的实例变量。

import java.awt.Color;
import java.awt.Graphics;


public class Snail {

Level l;
private double gravity = 10;
private double energyloss = 0.6;
private double xFriction = .95;
private double dt = .2;
int x = 0;
int y = 0;
double dx = 0;
double dy = 0;
int radius = 30;


public void chill(){
    moveUp();
}

public Snail() {
    // TODO Auto-generated constructor stub
}

public Snail(int i, int j) {
    // TODO Auto-generated constructor stub
    x = i;
    y = j;
}

public void moveUp() {
        dx = dx + l.velocityx;
        dy = dy + l.velocityy;
} 

public void update(Level l){

    if (x + dx > l.getWidth() -radius){
        x = l.getWidth() -radius;
        dx = - dx;
    }else if( x + dx < 0 +radius){
        x = 0+radius;
        dx = -dx;
    }
    else{
        x += dx;
    }

    if(y == l.getHeight()-radius)
        dx *= xFriction;
    if (Math.abs(dx) < .9){
        dx = 0;
    }

    if (y > l.getHeight() -radius){
        y = l.getHeight() -radius;
        dy *= energyloss;
        dy = - dy;
    }else{
        //velocity formula
        dy = dy + gravity *dt;
        //position formula
        y += dy*dt + .5*gravity*dt*dt;
    }

}

public void paint(Graphics g){
    g.setColor(Color.RED);
    g.fillOval(x-radius, y-radius, radius*2, radius*2);
}

最后是初始化关卡的类。

import javax.swing.JFrame;

public class Frame {


public static void main(String[] args){
    JFrame frame = new JFrame("Hard as Snails");
    frame.add(new Level());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1280,720);
    frame.setVisible(true);

}

任何人都可以帮助我解决我在这里做错了什么,我也是这个编码水平的新手所以请像和白痴说话一样解释。非常感谢您的宝贵时间!

最佳答案

您的Level l 对象似乎是null。因为你还没有初始化它,你正试图在 moveUp() 方法中使用它抛出 NullPointerException。

你应该按如下方式初始化它。

 Level l = new Level();
  1. 您应该分配值 double x = 1.0;。我到处都可以看到 double x = 1;,这可能会给您带来意想不到的结果。

关于线程 "AWT-EventQueue-0"java.lang.NullPointerException 中的 Java 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578604/

相关文章:

java - 使用嵌入式 Jetty 运行 JSF-2 页面?

java - 单击 JButton 时退出 JFrame

java - Java中如何将null转为false?

java - 将 Oracle DB 中的时区偏移量作为单独的字段存储

java - JTable Actionlistener 单击带有参数的行

java - 如何为Java bean属性设置新值(日期)?

java - 移动 jButton 时遇到问题

java - 尝试使用另一个类的方法时出现空指针异常

java - 解析映射器 XML 时出错。原因 : java. lang.NullPointerException

java - FileReader 未找到文件异常