【问题标题】:Java Null Pointer Exception with ListSelectionEvent带有 ListSelectionEvent 的 Java 空指针异常
【发布时间】:2014-04-09 15:21:07
【问题描述】:

当我删除数据库中的一行时,这种方法会导致运行时 NullPointer 异常,这让我很生气:

private void menuListValueChanged(javax.swing.event.ListSelectionEvent evt) {                                      
    int index = menuList.getSelectedIndex();
    int size = model.getSize();
    if (index >= 0) { 
        bDeleteMenu.setEnabled(true);
    } else { 
        bDeleteMenu.setEnabled(false);
        }
    Menu selectedMenu = (Menu)menuList.getSelectedValue();
    menuName.setText(selectedMenu.getMenuName());
}

错误在这一行: menuName.setText(selectedMenu.getMenuName());

并且仅在我删除项目时发生。 这是错误: 线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常。 我猜这是因为当我删除 Jlist 中的项目时,选择不会自动更改为下一个或类似的东西。

这是我用来删除项目的方法:

private void bDeleteMenuActionPerformed(java.awt.event.ActionEvent evt) {                                            
    Menu selectedMenu = (Menu)menuList.getSelectedValue();
    selectedMenu.getMenuName();
    int index = menuList.getSelectedIndex();
    DBConnection.deleteMenu(selectedMenu);
    int size = model.getSize();
    if (size == 0) { 
        bDeleteMenu.setEnabled(false);
    } else { 
        if (index == model.getSize()) {
            index--;
        }
        menuList.setSelectedIndex(index);
        menuList.ensureIndexIsVisible(index);
    }
    model.removeElement(selectedMenu);
    menuName.setText("");
}

谢谢!

【问题讨论】:

  • 您确认getMenuName() 没有返回null 值吗?
  • 您是否检查过其中哪个是null 值?可能是selectedMenu,menuName,selectedMenu.getMenuName(),也许可以尝试将这三个打印出来给你一个正确方向的指针(而不是一个空指针哈迪哈)
  • 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。

标签: java swing awt jlist


【解决方案1】:

检索所选菜单的名称仅在选择某些内容时才有意义。

替换

if (index >= 0) { 
    bDeleteMenu.setEnabled(true);
} else { 
    bDeleteMenu.setEnabled(false);
}
Menu selectedMenu = (Menu)menuList.getSelectedValue();
menuName.setText(selectedMenu.getMenuName());

if (index >= 0) { 
    bDeleteMenu.setEnabled(true);
    Menu selectedMenu = (Menu)menuList.getSelectedValue();
    menuName.setText(selectedMenu.getMenuName());
} else {
    bDeleteMenu.setEnabled(false);
}

希望这会有所帮助。

【讨论】:

  • 它工作正常,谢谢!但我不明白为什么。
  • 当没有选择任何内容时,index 的值为 -1。所以在这种情况下,selectedMenu 将是 null,因为 menuList.getSelectedValue() 将返回 null。所以你会在下一行得到一个空指针异常
  • 非常感谢!但是现在我不明白为什么在我以前的版本中它工作得很好,不同的是现在我正在使用(菜单)对象,以前我正在使用字符串,这是行 String field = (String) menuList。 getSelectedValue(); menuName.setText(字段);并且在 if 块之外!
  • selectedMenu.getMenuName() 给出了空指针异常。在您之前的代码中, selectedMenu 没有被取消引用,您没有得到任何异常
  • 很高兴知道它有帮助。如果您认为它有帮助,您可能希望接受它,以便其他人知道您的问题已得到解决。祝你好运。
猜你喜欢
  • 2013-12-02
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2014-03-09
  • 1970-01-01
相关资源
最近更新 更多