我对StackOverFlow相当陌生。我在Java方面有多年的经验,但在这段代码中似乎找不到触发Null指针异常的行。所有进口都准备好了。
public class BallShooter extends JFrame{
private JFrame ballshooter;
private BallShooter bs;
private MenuPanel mp;
private MainPanel mep;
private GamePanel gp;
private Balls balls;
private CardLayout card;
private int[] leaderboard;
private boolean ballHitWall;
public BallShooter()
{
mep = new MainPanel();
mp = new MenuPanel();
gp = new GamePanel();
ballshooter = new JFrame();
ballshooter.setLocation(0, 0);
ballshooter.setSize(800, 700);
ballshooter.setDefaultCloseOperation(EXIT_ON_CLOSE);
ballshooter.setBackground(Color.GRAY);
ballshooter.setResizable(false);
ballshooter.getContentPane().add(mep);
ballshooter.setVisible(true);
card = (CardLayout)(mep.getLayout());
}
public static void main(String [] args)
{
BallShooter balls = new BallShooter();
}
class MainPanel extends JPanel
{
public MainPanel()
{
setSize(800,700);
setVisible(true);
setBackground(Color.GRAY);
setLayout(new CardLayout());
add(mp); <-- line 52
add(gp);
}
}
class MenuPanel extends JPanel implements ActionListener
{
private JButton startGame;
private JButton leaderboard;
private JButton instructions;
public MenuPanel()
{
setLayout(null);
setSize(800,700);
setBackground(Color.GRAY);
startGame = new JButton("Start the GAME.");
leaderboard = new JButton("Go to LEADERBOARD.");
instructions = new JButton("Instructions.");
startGame.addActionListener(this);
leaderboard.addActionListener(this);
instructions.addActionListener(this);
startGame.setBounds(300,100,200,150);
leaderboard.setBounds(300,250,200,150);
instructions.setBounds(300,400,200,150);
add(startGame);
add(leaderboard);
add(instructions);
}
public void actionPerformed(ActionEvent e) {
String in = e.getActionCommand();
if(in.equals("Start the GAME."))
{
card.next(mep);
}
}
}
class GamePanel extends JPanel implements ActionListener
{
private JButton stats;
private int pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9,pos10,pos11,pos12,pos13,pos14,pos15,pos16,pos17,pos18,pos19,pos20 ;
private boolean onePos,twoPos,threePos,fourPos,fivePos,sixPos,sevenPos,eightPos,ninePos,tenPos,elevenPos,twelvePos,thirteenPos,fourteenPos,fifteenPos,sixteenPos,seventeenPos,eighteenPos,ninteenPos,twentyPos = true;
private int x,y;
public GamePanel()
{
balls = new Balls();
onePos = true;
setSize(800,700);
setBackground(Color.GRAY);
setLayout(null);
if(onePos)
{
pos1 = 1;
x = 100;
y = 100;
balls.setBounds(x,y, 50,50);
gp.add(balls);
}
}
public void actionPerformed(ActionEvent e) {}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.WHITE);
g.drawRect(100, 100, 600, 500);
}
}
class Balls extends JPanel {
private int color;
private int vX, vY;
private int ballW = 50, ballH = 50;
private int x,y;
public Balls()
{
setSize(50,50);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
color = (int)(Math.random()*4+1);
if(color == 1)
{
g.setColor(Color.YELLOW);
g.drawOval(0, 0, ballW, ballH);
}
else if(color == 2)
{
g.setColor(Color.GREEN);
g.drawOval(0, 0, ballW, ballH);
}
else if(color == 3)
{
g.setColor(Color.RED);
g.drawOval(0, 0, ballW, ballH);
}
else if(color == 4)
{
g.setColor(Color.BLUE);
g.drawOval(0, 0, ballW, ballH);
}
}
}
}我不知道怎么回事。它只是飞过我的头顶。错误:
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1097)
at java.awt.Container.add(Container.java:417)
at BallShooter$MainPanel.<init>(BallShooter.java:52)
at BallShooter.<init>(BallShooter.java:24)
at BallShooter.main(BallShooter.java:42)如果有人能在这方面帮助我,那将是非常感谢的。编辑第一次投递,所以格式化有一个错误。类头没有进入代码部分,也没有进入最后一个括号。
发布于 2017-05-13 01:42:47
您正在初始化非静态嵌套类MainPanel,它在初始化mp和gp字段之前使用BallShooter类中的字段(参见MainPanel构造函数中调用#add的行)。在创建了所有菜单之后,尝试调用mep#add,或者考虑一些类似于#init方法的内容(甚至是不同的层次结构/设计)。
发布于 2017-05-13 01:53:31
General rule --当您读取这样的堆栈跟踪时,请查找第一行,它是您的类之一,而不是JDK或库类。在这种情况下,问题可以在BallShooter.java的第52行中找到。
当该行运行时,mp是null,因此您试图向容器中添加一个null,因此出现了异常。
要解决这个问题,首先创建另外两个面板,最后创建MainPanel。
https://stackoverflow.com/questions/43948412
复制相似问题