获得NullPointerException

时间:2011-03-26 13:36:18

标签: java nullpointerexception

为什么我得到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");
        }

    }

}

3 个答案:

答案 0 :(得分:1)

因为您从未初始化s类的JTPanel字段。尝试更改此行:

    Shape[] s=new Shape[3];

    this.s=new Shape[3];

通过此更改,您将初始化字段,而不仅仅是创建局部变量。

答案 1 :(得分:1)

因为您已声明Shape[] s;但尚未对其进行初始化,但仍在行r=(Rectangle2D)s[0];中使用它。

答案 2 :(得分:1)

JTPanel中的

始终为null。在构造函数中创建数组时,将其分配给名为s的局部变量而不是实例变量。这将解决您的问题:

JTPanel()
{   
    //setBackground(Color.red);
    s=new Shape[3];