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)
@JoachimPileborgg2
不能为null
,除非OP调用paintComponent
并向其传递null
值。。。