2016-05-14 76 views
0

我要像下面的Java代碼翻譯成斯卡拉:NullPointerException異常Scala的類的構造函數訪問VAL場時

private HashMap<KeyStroke,Action>actionMap=new HashMap<KeyStroke,Action>(); 

KeyStroke left = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0); 
//.... 
actionMap.put(left, new AbstractAction("move left") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     doSomething(); 
    } 
} 

我最初的嘗試是這樣的:

import java.awt.event.ActionEvent 
import java.awt.event.ActionListener 
import java.awt.event.KeyEvent 
import java.awt._ 
import javax.swing.JFrame 
import javax.swing.JPanel 
import javax.swing.Action 
import javax.swing.AbstractAction 
import javax.swing.KeyStroke 
import collection.mutable.HashMap 
object Main{ 
    def main(args:Array[String]){ 
    val gui:GUI = new GUI() 
    } 
} 

class GUI extends JFrame{ 
    initKeyboard 
    pack 
    this.setVisible(true) 
    private val actionMap = new HashMap[KeyStroke,Action] 
    def initKeyboard{ 
    val left = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0) 
    actionMap.put(left, new AbstractAction("Move Left"){ 
     override def actionPerformed(e:ActionEvent){ 
     println("Do something") 
     } 
    })//actionMap.put 
    } 

} 

請注意,我沒有但是編寫了代碼來處理actionMap。

但是我得到以下運行時錯誤:

Java.lang.NullPointerException 
    at GUI.initKeyboard(Game.scala:24) 
    at GUI.<init>(Game.scala:18) 
    at Main$.main(Game.scala:13) 
    at Main.main(Game.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

(注意,第24行是啓動「actionMap.put」行)

如何來實施?

+0

請提供自站立,重複的例子。 –

+1

因爲它代表着你的代碼是不可執行的(我們不知道'GUI'看起來如何),所以沒有人可以看到你做錯了什麼。只要執行這三條線就行。 –

+0

請看我最近的編輯;) – user2547306

回答

2

問題出在初始化順序。

以下是新GUI實例創建執行,在順序列出

initKeyboard 
pack 
this.setVisible(true) 
private val actionMap = new HashMap[KeyStroke,Action] 

你可以看到,你叫initKeyboard之前初始化actionMap。因此在initKeyboard內部訪問它會引發異常。

你可以用這個簡單的例子驗證初始化順序:

class GUI extends { 
    initKeyboard 
    private val actionMap = println("actionMap") 
    def initKeyboard: Unit = { 
    println("initKeyboard") 
    } 
} 
new GUI // prints: initKeyboard actionMap 
+0

謝謝,我現在覺得很愚蠢;) – user2547306