私は学校のためのランダムな迷路ジェネレータを作っています。私は現在、ユーザーが矢印キーを使って迷路を移動する機能を追加しています。問題は、メインクラスの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)
ありがとう!
エラーが発生したら、常に行番号を投稿してください。 –
これはレビューするにはあまりにも多くのコードです。問題を再現する**最小限の**コード量に調整してください。直接発生していないか、エラーに関連していないコードをすべて削除してください。詳細は、[mcve]を参照してください。 –
'私はそれらの投稿を見てきましたが、私の問題には/私の問題に対処/対応していないようです - その理由は常に同じです:' Object is null'です。これはあなたが得る最も一般的な例外です。あなたがNPEを取得するたびに質問を投稿する予定はないと思います。解決策は、問題の原因となっているステートメントを調べて、その行のどの変数がNULLであるかを判別することです。その後、問題を解決してください。 Mazeクラスの行番号263はどのようなものかわかりません。 – camickr