NullPointerException с JFrame - PullRequest
       11

NullPointerException с JFrame

3 голосов
/ 23 сентября 2011

На данный момент все, что я хочу, чтобы эта программа, - это запустить без каких-либо ошибок компиляции.По сути, мне нужно открыть кадр, а затем, когда кадр выбран, если я нажму клавишу со стрелкой вверх, он установит стрелки [0] в значение true, а когда я отпущу его, он установит его в значение false (то жевправо, вниз и влево) ...

Мой код скомпилируется.Тем не менее, я продолжаю получать эту ошибку, когда пытаюсь ее запустить.

java.lang.NullPointerException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)

Я сделал программу, похожую на эту, и у меня никогда не было этой проблемы.Первоначально я думал, что это из-за "frame.addKeyListener;"или "frame.setFocasable (true);"но я попытался убрать эти строки, и все равно возникла ошибка ...

Вот код, который я запускаю, любая помощь, чтобы исправить эту проблему, была бы полезна.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.*;

public class arrowTest extends JApplet implements KeyListener {

  private boolean[] arrows = new boolean[4];
  private int x = 0;
  private int y = 0;

  public arrowTest() {

  }

  // Handle the key typed event from the text field.
  public void keyTyped(KeyEvent e) {
    System.out.println("KEY TYPED: ");
  }

  // Handle the key-pressed event from the text field.
  public void keyPressed(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_UP) {
      arrows[0] = true;
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
      arrows[1] = true;
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      arrows[2] = true;
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
      arrows[3] = true;
    }

  }

  public void keyReleased(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_UP) {
      arrows[0] = false;
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
      arrows[1] = false;
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      arrows[2] = false;
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
      arrows[3] = false;
    }

  }

  public void run() {

    JFrame frame = new JFrame();
    JApplet applet = new arrowTest();
    frame.add(applet);
    frame.setTitle("arrowTest");
    frame.setLocationRelativeTo(null); // Center the frame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 200);
    frame.setVisible(true);
    frame.addKeyListener(this);
    frame.setFocusable(true);

  }

  public void main(String[] args) {

    run();

  }
}

1 Ответ

2 голосов
/ 23 сентября 2011

В настоящий момент все, что я хочу, чтобы эта программа выполнялась без ошибок компиляции.

Для записи ваша программа выполняет без "ошибок компиляции". Вы получаете исключение пустого указателя (NPE) во время работы программы, а не ошибку компиляции. Вам нужно выяснить, какая строка вызывает ваш NPE, а затем исправить это, убедившись, что все ссылочные переменные были инициализированы перед их использованием.

Но также вы не должны использовать KeyListeners для этого, а вместо этого использовать привязки клавиш - есть большая разница. Учебник по связыванию ключей объяснит все. Поначалу это может показаться немного сложным, но не сдавайтесь, следуйте примерам, и вы сразу же будете его использовать.

А почему вы используете JApplet, когда пытаетесь создать JFrame? Это немного забавно.

Редактировать 2
И ваш код даже не будет работать, так как ваш основной метод не является статичным. Если вы запускаете свою программу как настоящий JFrame, вам нужно будет показать нам фактический код, который вы использовали. Этот код не имеет жизнеспособного метода main и поэтому не является им.

Редактировать 3
Нет, статика - это не ваша проблема, но все же вам нужно научиться использовать связывание клавиш и не смешивать код JApplet и JFrame в этой странной химере, которую вы получили.

...