访问DefaultListModel的索引时出现空指针异常



我有一个列表:

JList characterList = new JList(characterListModel);
characterListModel = new DefaultListModel();        
String myCharacters[]={"Dean Winchester","Sam Winchester",
            "Bobby Singer","Castiel"};
for (String myCharacter : myCharacters) {
        ((DefaultListModel) characterList.getModel()).addElement(myCharacter);  
}

我在一个单独的类中写了一个方法,用来删除选定索引处的字符:

public void removeCharacter() {
    DefaultListModel characterListModel = ((PlayerContentPane) IViewManager.Util.getInstance()
        .getMyContainerPane().getMyPlayerManagerPane().getContentPane())
        .getCharacterListModel();
    JList characterList = ((PlayerContentPane) IViewManager.Util.getInstance()
        .getMyContainerPane().getMyPlayerManagerPane().getContentPane())
        .getCharacterList();
    int idx = characterList.getSelectedIndex(); //<---line 62
    int size = characterListModel.getSize();
    characterListModel.remove(idx);
    if (size == 0) { 
        //do nothing
    } else { 
        if (idx == characterListModel.getSize()) {
            idx--;
        }
        characterList.setSelectedIndex(idx);
        characterList.ensureIndexIsVisible(idx);
    }
}

然而,当我用按钮运行它时,我会得到这个堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.detica.LarpDB.Controller.Controller.removeCharacter(Controller.java:62)
at com.detica.LarpDB.view.PlayerContentPane$3.actionPerformed(PlayerContentPane.java:94)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

我在谷歌上看到的很多问题都源于以下行:DefaultListModel characterListModel = ....他们的问题是,他们创建了一个对象的new实例,现在我对整个Java只是个新手,但这对我来说不应该是个问题,因为我没有做任何新的东西,我只是具体说明了这是哪个对象

有人能帮我解开吗?

这两行可能会产生很多问题:

DefaultListModel characterListModel = ((PlayerContentPane) IViewManager.Util.getInstance()
    .getMyContainerPane().getMyPlayerManagerPane().getContentPane())
    .getCharacterListModel();
JList characterList = ((PlayerContentPane) IViewManager.Util.getInstance()
    .getMyContainerPane().getMyPlayerManagerPane().getContentPane())
    .getCharacterList();

如果任何链接的方法返回null(无论出于何种原因),则该行将抛出NullPointerException。

我建议您将它们分解为几行,并检查每个调用的值,看看从哪里获得null

编辑

刚刚意识到62行是int idx = characterList.getSelectedIndex();。意味着characterList为空。

如果它在您指示的第62行失败,那么该行上唯一引用的对象,也就是唯一可能为null的对象,就是characterList。这意味着您的getCharacterList函数将返回null。(如果错误在getSelectedIndex函数内,那么堆栈跟踪中会有另一行。)

由于您没有发布getCharacterList函数,我不能说太多了。但是你应该看看这个函数,看看在什么情况下它会返回null。

相关内容

  • 没有找到相关文章

最新更新