Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我有一个空指针异常和don';我不知道如何修理它_Java_Swing_Nullpointerexception - Fatal编程技术网

Java 我有一个空指针异常和don';我不知道如何修理它

Java 我有一个空指针异常和don';我不知道如何修理它,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我试着去看电影,但没用。下面是堆栈跟踪的第一行和第二行: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Client.SpriteField.paintComponent(SpriteField.java:30) 这告诉我它在包“Client”、类“SpriteField”和方法“paintComponent”中,对吗?下面是类SpriteField中的代码: package Client;

我试着去看电影,但没用。下面是堆栈跟踪的第一行和第二行:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Client.SpriteField.paintComponent(SpriteField.java:30)
这告诉我它在包“Client”、类“SpriteField”和方法“paintComponent”中,对吗?下面是类SpriteField中的代码:

package Client;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

import javax.swing.JPanel;

public class SpriteField extends JPanel 
{
    RoundSprite mSprite;
    public void CreateSpriteAt(float tX, float tY, int tWidth, int tHeight, int tRotation) 
    {
        mSprite = new RoundSprite();
        mSprite.SetPosition(tX, tY);
        mSprite.SetSpriteWidth(tWidth);
        mSprite.SetSpriteHeight(tHeight);
        mSprite.SetSpriteRotation(tRotation);
    }
    public void paintComponent (Graphics g)
    {
        if(g != null)
        {
            super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        AffineTransform tOldTransform = g2.getTransform();

        mSprite.DrawSprite(g2);

        g2.setTransform(tOldTransform);
        }
    }

}
这可能只是一个粗心的错误,但我似乎找不到它。请帮忙,谢谢你的时间

编辑:按要求,以下是主要方法:

final SpriteField mSpritePanel = new SpriteField();
mSpritePanel.addMouseListener(new MouseAdapter() 
{
    public void mouseClicked(MouseEvent e)
    {
        float tX = e.getX();
        float tY = e.getY();
        if(tTextWidth.getText() == null)
        {
            tTextWidth.setText("50");
        }
        int tIntWidth = Integer.parseInt(tTextWidth.getText());
        if(tIntWidth == 0)
        {
            tIntWidth = 50;
        }
        if(tTextHeight.getText() == null)
        {
            tTextHeight.setText("50");
        }
        int tIntHeight = Integer.parseInt(tTextHeight.getText());
        if(tIntHeight == 0)
        {
            tIntHeight = 50;
        }
        int tRotate = Integer.parseInt(tTextRotation.getText());
        mSpritePanel.CreateSpriteAt(tX, tY, tIntWidth, tIntHeight, tRotate); 
        mSpritePanel.repaint();
    }
});
问题就在这里

mSprite.DrawSprite(g2); // you need to initialize mSprite
但是这里的
mSprite
null


通过调试,您可以很容易地发现此类错误

直到很久以后,组件已经出现在屏幕上之后,您才调用
CreateSpriteAt
。第一次到达
mSprite.DrawSprite(g2)
它当然会随着NPE爆炸,因为
mSprite
字段最初为空

简单的解决方法是在变量为null时不尝试绘制精灵:

if (mSprite != null) mSprite.DrawSprite(g2);
然而,既然您已经将这个类命名为SpriteField,那么您真正想要的可能是一个sprite列表,而不是一个sprite

public class SpriteField extends JPanel {
    final List<RoundSprite> sprites = new ArrayList<>();

    public void CreateSpriteAt(float tX, float tY, int tWidth, int tHeight, int tRotation) {
        RoundSprite s = new RoundSprite();
        s.SetPosition(tX, tY);
        s.SetSpriteWidth(tWidth);
        s.SetSpriteHeight(tHeight);
        s.SetSpriteRotation(tRotation);
        sprites.add(s);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        AffineTransform originalTransform = g2.getTransform();

        for (RoundSprite s : sprites) {
            s.DrawSprite(g2);
            g2.setTransform(originalTransform);
        }
    }
}
公共类SpriteField扩展了JPanel{
最终列表精灵=新的ArrayList();
public void CreateSpriteAt(浮点tX、浮点tY、整数tWidth、整数tHeight、整数tRotation){
RoundSprite s=新的RoundSprite();
s、 设置位置(tX,tY);
s、 设置PriteWidth(tWidth);
s、 设置PriteHeight(右侧);
s、 设置旋转(旋转);
雪碧。添加(s);
}
@凌驾
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
仿射转换原始转换=g2.getTransform();
用于(圆形精灵s:精灵){
s、 DrawSprite(g2);
g2.集合变换(原始变换);
}
}
}

请考虑以下标准java命名约定! 在调用createSpriteAt()之前,请检查是否正在调用paintComponent()?最好也包括你的主要方法。请指出第50行,哪一行是源文件中的第30行?手动计数,我没有得到第30行,而是得到了
g2.setTransform(tOldTransform)
@JoachimPileborg
g2
不能为
null
,除非OP调用
paintComponent
并向其传递
null
值。。。