2017-05-13 1 views
0

Je suis relativement nouveau sur StackOverFlow. J'ai une expérience de plusieurs années avec Java, mais je n'arrive pas à trouver la ou les lignes dans ce code qui déclenchent l'exception du pointeur Null. Les importations sont toutes prêtes.Exception du pointeur nul

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); 
      } 

     } 

    } 
} 

Je n'ai aucune idée de ce qui se passe. C'est juste de voler au dessus de ma tête. L'erreur:

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) 

Si quelqu'un pouvait m'aider avec cela, ce serait grandement apprécié. EDIT La première fois, il y a une erreur dans le formatage. L'en-tête de la classe n'est pas passé dans la section de code et la dernière parenthèse.

+0

Vous devriez vraiment spécifier quelle est la ligne 52 car c'est la dernière ligne concernant votre propre code dans la trace de la pile. Donc, sachant que vous pouvez commencer à chercher ce qui manque à ce point dans votre code, ou au moins nous aider à savoir où trouver une solution potentielle –

+0

Commentaire de conception: Vous pourriez considérer un 'boolean []' et 'int []' dans votre classe GamePanel au lieu de 20 booléens et ints. – Rogue

+1

Copie possible de [Qu'est-ce qu'une exception NullPointerException et comment la réparer?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it –

Répondre

0

Vous êtes l'initialisation de la classe imbriquée non statique MainPanel, qui utilise vos mp et gp champs de la classe BallShooter avant qu'ils ne soient initialisés (voir les lignes qui appellent #add dans le constructeur MainPanel). Essayez d'appeler le mep#add après avoir créé tous les menus, ou considérez quelque chose comme une méthode #init (ou même une autre hiérarchie/conception). - Lorsque vous lisez une trace de pile comme celle-ci, recherchez la première ligne de l'une de vos classes, par opposition à une classe JDK ou à une classe de bibliothèque.

3

Dans ce cas, le problème peut être trouvé sur la ligne 52 de BallShooter.java.

Lorsque cette ligne s'exécute, mp est null, vous essayez donc d'ajouter une valeur nulle à votre conteneur, d'où l'exception.

Pour résoudre ce problème, commencez par créer les deux autres panneaux et le MainPanel en dernier.