为什么我得到NullPointerException
?
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
public class Tetris
{
public static void main(String... args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
TFrame w1=new TFrame();
w1.setVisible(true);
w1.setDefaultCloseOperation(w1.EXIT_ON_CLOSE);
}
});
}
}
class TFrame extends JFrame
{
TFrame()
{
setLayout(null);
setSize(400,800);
JTPanel jp1=new JTPanel();
jp1.setBackground(Color.red);
jp1.setLayout(null);
jp1.setBounds(0,0,400,800);
add(jp1);
}
}
class JTPanel extends JPanel
{
Shape[] s;
Rectangle2D r;
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D gd=(Graphics2D)g;
r=(Rectangle2D)s[0];
System.out.println("first");
r.setFrame(80,20,100,200);
gd.draw(s[0]);
}
JTPanel()
{
//setBackground(Color.red);
Shape[] s=new Shape[3];
for(int i=0;i<3;i++)
{
s[i]=new Rectangle2D.Double();
System.out.println("second");
}
}
}
答案 0 :(得分:1)
因为您从未初始化s
类的JTPanel
字段。尝试更改此行:
Shape[] s=new Shape[3];
到
this.s=new Shape[3];
通过此更改,您将初始化字段,而不仅仅是创建局部变量。
答案 1 :(得分:1)
因为您已声明Shape[] s;
但尚未对其进行初始化,但仍在行r=(Rectangle2D)s[0];
中使用它。
答案 2 :(得分:1)
始终为null。在构造函数中创建数组时,将其分配给名为s的局部变量而不是实例变量。这将解决您的问题:
JTPanel()
{
//setBackground(Color.red);
s=new Shape[3];