2016-05-14 49 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