2011-09-23 108 views
3

目前我希望這個程序要做的就是運行時沒有任何編譯錯誤。基本上,我需要做的是打開框架,然後當框架被選中時,如果我按下向上箭頭鍵將箭頭[0]設置爲true,當我釋放它將它設置爲false(與向右,向下,向左)...帶有JFrame的NullPointerException

我的代碼將被編譯。但是,當我嘗試運行它時,我不斷收到此錯誤。

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

    } 
} 
+0

由DrJava中的錯誤引起。看到這裏:http://stackoverflow.com/questions/7911004/nullpointerexcetion-native-method-accessor-hashing-words-issue –

回答

2

此刻所有我想要這個程序做的是運行沒有任何編譯錯誤。

爲了記錄在案,你的程序確實沒有 「編譯錯誤」 運行。發生什麼事情是在運行程序期間拋出一個空指針異常(NPE),而不是編譯錯誤。你需要找出哪些線路導致你的NPE,然後通過確保所有參考變量在使用之前被初始化來修復它。

但是,你也不應該使用KeyListeners來做這件事,而是使用Key Bindings - 這是一個很大的區別。關鍵綁定教程將解釋所有。它起初看起來有點令人生畏,但不要放棄,遵循這些例子,你很快就會使用它。

爲什麼你在試圖創建JFrame時使用JApplet?這只是有點時髦。

編輯2
而你的代碼將不能運行,因爲您的主要方法是非靜態的。如果您將程序作爲實際的JFrame運行,那麼您需要向我們展示您使用的實際代碼。這段代碼沒有可行的主要方法,因此不是這樣。

編輯3
沒有,靜是不是你的問題,仍然需要學習使用鍵綁定,並在你有這個奇怪的嵌合體不能混用JApplet的和JFrame的代碼。

+2

我敢打賭,NPE是由主要方法不是靜態引起的。 Java博士拋出異常,而不是他的代碼。當你使用反射來調用一個實例方法,但將一個空實例傳遞給'Method.invoke'時,會發生這種情況。 Java博士在呈現錯誤方面做得並不好。 –

+0

啊!我現在覺得很蠢。我確實說過它會編譯,但這只是你引用我的壞詞選擇。無論如何,謝謝,非靜態的主要問題。我不知道我爲什麼這麼做xD – Aerophite

+0

@MichaelMorelock:see edit 3 –