当访问DefaultListModel的索引时,空指针异常

时间:2012-07-23 14:59:28

标签: java nullpointerexception 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事物只是新手,但这不应该是我的问题,因为我没有做任何新的,我只是具体说明这是什么对象。

请有人帮我纠正自己吗?

2 个答案:

答案 0 :(得分:3)

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

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为空。

答案 1 :(得分:2)

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

由于你没有发布getCharacterList函数,我不能说更多。但是你应该看看那个函数,看看在什么情况下它可以返回null。