2016-05-14 3 views
0

Я хочу, чтобы перевести что-то вроде следующего кода Java в Scala:NullPointerException при доступе к VAL поле в конструкторе класса Scala

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