3

現時点では、このプログラムに実行させたいのは、コンパイルエラーなしで実行することだけです。基本的には、フレームを開いて、フレームを選択したときに上矢印キーを押すと、arrows [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();

  }
}
4

1 に答える 1

2

現時点では、このプログラムに実行させたいのは、コンパイルエラーなしで実行することだけです。

ちなみに、プログラム「コンパイルエラー」なしで実行されます。何が起こっているのかというと、コンパイルエラーではなく、プログラムの実行中にnullポインター例外(NPE)がスローされます。NPEの原因となっている行を特定し、それらを使用する前にすべての参照変数が初期化されていることを確認して修正する必要があります。

ただし、これにはKeyListenersを使用するのではなく、代わりにKeyBindingsを使用する必要があります。大きな違いがあります。キーバインディングチュートリアルですべてを説明します。最初は少し気が遠くなるように見えるかもしれませんが、あきらめずに例に従ってください。すぐに使用できるようになります。

また、JFrameを作成しようとしているときに、なぜJAppletを使用しているのですか?それはちょっとファンキーです。

編集2
そして、メインメソッドは非静的であるため、コードは実行されません。プログラムを実際のJFrameとして実行している場合は、使用した実際のコードを表示する必要があります。このコードには実行可能なメインメソッドがないため、そうではありません。

編集3
いいえ、静的は問題ではありません。それでも、キーバインディングの使用方法を学び、この奇妙なキメラにJAppletコードとJFrameコードを混在させないようにする必要があります。

于 2011-09-23T18:48:10.053 に答える