2016-05-27 5 views
-1

私は学校のためのランダムな迷路ジェネレータを作っています。私は現在、ユーザーが矢印キーを使って迷路を移動する機能を追加しています。問題は、メインクラスのMazeにある関数をイベントリスナークラスから呼び出すと、NPEエラーが発生することです。私がcompオブジェクトを使用しようとすると、moveCircleメソッドで発生するようです。このメソッドは、MyKeyListenerクラスから呼び出されます。オブジェクトを使用して別のクラスからメソッドを呼び出すときのヌルポインタの例外

エラーはMyKeyListenerクラスから発生したようで、MazeクラスのmoveCircle関数が呼び出されたときに発生します。 NPEは、LineComponent compオブジェクト(他のクラスのLineComponentからのもの)に関連付けられているようです。私の小さな知識から、これはおそらく私の変数の範囲で何かをしなければならないようですが、私はそれを解決する方法を正確には知らないのです。

また、NPEについては他に多くの投稿がありましたが、私はこれらの投稿を見ていて、私の問題には対処していないようです。

メイン・クラスの迷路:

package mazegenerator; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 

public class Maze extends JFrame{ 
    //Global Variables 
    int dim = 0; 
    int factor = 20;//Determines scalling of maze 
    int borderFactor = factor; 
    int radius = 16; 
    int circleX = 0; 
    int circleY = 0; 
    Color colour = Color.red; 
    Color circleColour = Color.black; 
    boolean[][] north; 
    boolean[][] east; 
    boolean[][] south; 
    boolean[][] west; 
    boolean[][] visited; 
    JFrame frame; 
    public LineComponent comp; 
    JTextArea time; 
    JPanel buttonsPanel; 


    public void setup(){ 
     ImageIcon icon = new ImageIcon("drmaze4.gif"); 
     frame = new JFrame("Random Maze Generator"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setIconImage(icon.getImage()); 
     frame.setBackground(Color.LIGHT_GRAY); 
     frame.setCursor(Cursor.HAND_CURSOR); 

     try{ 
      dim = Integer.decode((String)JOptionPane.showInputDialog(frame, "Welcome to the random maze generator!\nEnter The Side Length (Integer 10 -> 45) Of The Maze:\n(Scale is input x 10 in pixels)",null,JOptionPane.INFORMATION_MESSAGE, null, null, 40)); 
      if(dim < 10 || dim > 45){ 
       dim = 40; 
      } 
     }catch(NumberFormatException e){ 
      dim = Integer.decode((String)JOptionPane.showInputDialog(frame, "Please Enter A Valid Integer!", null,JOptionPane.ERROR_MESSAGE)); 
      if(dim < 10 || dim > 45){ 
       dim = 40; 
      } 
     } 
     comp = new LineComponent(); 
     comp.setPreferredSize(new Dimension(dim*borderFactor, dim*borderFactor)); 
     frame.getContentPane().add(comp, BorderLayout.CENTER); 
     buttonsPanel = new JPanel(); 
     buttonsPanel.setBackground(Color.gray); 
     final JButton drawMazeBtn = new JButton("Draw Maze"); 
     buttonsPanel.add(drawMazeBtn); 
     final JButton playBtn = new JButton("Play Maze"); 
     buttonsPanel.add(playBtn); 
     playBtn.setVisible(false); 
     time = new JTextArea(); 
     time.setSize(200, 100); 
     time.setText("Maze Generation Time: "); 
     time.setEditable(false); 
     buttonsPanel.add(time); 
     frame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); 

     //menu Bar Code 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu menu = new JMenu("Info"); 
     menu.setMnemonic(KeyEvent.VK_A); 
     menuBar.add(menu); 
     JMenuItem about = new JMenuItem("About", KeyEvent.VK_T); 
     menu.add(about); 
     JMenuItem creator = new JMenuItem("Creator", KeyEvent.VK_T); 
     menu.add(creator); 
     frame.setJMenuBar(menuBar); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public void play(){ 
     MyKeyListener listener = new MyKeyListener(); 
     buttonsPanel.addKeyListener(listener); 
     buttonsPanel.requestFocusInWindow(); 
     System.out.println("Working"); 
     circleX = 2*factor-2; 
     circleY = 2*factor-2; 
     comp.addCircle(circleX, circleY, radius, circleColour); 
    } 

    public void moveCircle(int direction){ 
     if(direction == 0){//up 
      System.out.println("Up"); 
      circleY -= factor; 
      comp.removeLastCircle(); 
      comp.addCircle(circleX, circleY, radius, circleColour); 
     } 
     if(direction == 1){//right 
      System.out.println("Right"); 
     } 
     if(direction == 2){//down 
      System.out.println("Down"); 
      comp.removeLastCircle(); 
      comp.addCircle(circleX, circleY, radius, circleColour); 
      //repaint(); 
     } 
     if(direction == 3){//left 
      System.out.println("Left"); 
     } 
    } 

    public static void main(String[] args) { 
     Maze maze = new Maze(); 
     maze.setup(); 
     maze.init(); 
     maze.drawBorder(); 
     long startTime = System.currentTimeMillis(); 
     maze.create(1,1); 
     maze.removeRandom(); 
     long finishedTime = System.currentTimeMillis(); 
     long duration = finishedTime - startTime; 
     maze.displayTime(duration); 
    } 

} 

クラスMyKeyListener:

public class MyKeyListener implements KeyListener{ 
    @Override 
    public void keyPressed(KeyEvent e) { 
     Maze listenMaze = new Maze(); 
     if(e.getKeyCode() == KeyEvent.VK_UP){ 
      //System.out.println("Up"); 
      listenMaze.moveCircle(0); 
     } 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 
      //System.out.println("Right"); 
      listenMaze.moveCircle(1); 
     } 
     if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
      //System.out.println("Down"); 
     } 
     if(e.getKeyCode() == KeyEvent.VK_LEFT){ 
      //System.out.println("Left"); 
      listenMaze.moveCircle(3); 
     } 
     //throw new UnsupportedOperationException("Not supported yet."); 
    } 
} 

エラーメッセージ:事前に

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
     at mazegenerator.Maze.moveCircle(Maze.java:263) 
     at mazegenerator.MyKeyListener.keyPressed(MyKeyListener.java:18) 
     at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:232) 
     at java.awt.Component.processKeyEvent(Component.java:6255) 
     at javax.swing.JComponent.processKeyEvent(JComponent.java:2809) 
     at java.awt.Component.processEvent(Component.java:6074) 
     at java.awt.Container.processEvent(Container.java:2039) 
     at java.awt.Component.dispatchEventImpl(Component.java:4660) 
     at java.awt.Container.dispatchEventImpl(Container.java:2097) 
     at java.awt.Component.dispatchEvent(Component.java:4488) 
     at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1856) 
     at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:722) 
     at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1000) 
     at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:865) 
     at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:686) 
     at java.awt.Component.dispatchEventImpl(Component.java:4532) 
     at java.awt.Container.dispatchEventImpl(Container.java:2097) 
     at java.awt.Window.dispatchEventImpl(Window.java:2489) 
     at java.awt.Component.dispatchEvent(Component.java:4488) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:674) 
     at java.awt.EventQueue.access$400(EventQueue.java:81) 
     at java.awt.EventQueue$2.run(EventQueue.java:633) 
     at java.awt.EventQueue$2.run(EventQueue.java:631) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
     at java.awt.EventQueue$3.run(EventQueue.java:647) 
     at java.awt.EventQueue$3.run(EventQueue.java:645) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:644) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

ありがとう!

+1

エラーが発生したら、常に行番号を投稿してください。 –

+1

これはレビューするにはあまりにも多くのコードです。問題を再現する**最小限の**コード量に調整してください。直接発生していないか、エラーに関連していないコードをすべて削除してください。詳細は、[mcve]を参照してください。 –

+0

'私はそれらの投稿を見てきましたが、私の問題には/私の問題に対処/対応していないようです - その理由は常に同じです:' Object is null'です。これはあなたが得る最も一般的な例外です。あなたがNPEを取得するたびに質問を投稿する予定はないと思います。解決策は、問題の原因となっているステートメントを調べて、その行のどの変数がNULLであるかを判別することです。その後、問題を解決してください。 Mazeクラスの行番号263はどのようなものかわかりません。 – camickr

答えて

0

はMyKeyListener.keyPressedの実装を見てください:

Maze listenMaze = new Maze(); 

新しい迷路にキーが押されるたびに作成されていますが、他の人の間で初期化します設定方法を呼び出すことはありませんcompメンバー。だからあなたはNullPointerExceptionを取得します。

しかし、キーを押すたびに新しいMazeを作成するのではなく、メイン関数で作成したものを操作したいと思うことでしょう。だから、MyKeyListenerとクラスメンバを持っているし、最高のコンストラクタ内で初期化します:

class MyKeyListener 
{ 
    private Maze listenMaze; 

    public MyKeyListener(Maze theMaze) 
    { 
     this.listenMaze = theMaze; 
    } 
} 

私は現在、あなたが新しいキーリスナーあなたがプレイを押すたびに、必要に応じない理由が表示されません。ですから、Maze.setup()内で作成することをお勧めします。

// ... 
buttonsPanel = new JPanel(); 
buttonsPanel.addKeyListener(new MyKeyListener(this)); 
// ... 
+0

これに答える時間をとってくれてありがとう!これはすべて今より多くの意味があります。最初に作成したMazeオブジェクトを操作する方法がわかりませんでした。 – jaybuilder

関連する問題