Java:用对象填充JComboBox

Java:用对象填充JComboBox,java,swing,object,arraylist,jcombobox,Java,Swing,Object,Arraylist,Jcombobox,我试图用对象填充jComboBox。我让它在一个类中工作,但是在这个类中它给出了一个NullPointerException,但是代码几乎是一样的。我错过了什么 我用来填充组合框的代码: 我已经将每个变量翻译成英语,并删除了一些不必要的内容。我希望你们现在更清楚了: package unive.billing.boundary.clientmanager.frames; import unive.billing.control.ClientsManager; import unive.bill

我试图用对象填充jComboBox。我让它在一个类中工作,但是在这个类中它给出了一个
NullPointerException
,但是代码几乎是一样的。我错过了什么

我用来填充组合框的代码:

我已经将每个变量翻译成英语,并删除了一些不必要的内容。我希望你们现在更清楚了:

package unive.billing.boundary.clientmanager.frames;

import unive.billing.control.ClientsManager;
import unive.billing.control.InsuranceManager;

/**
 *
 * @author Forza
 */

public class ClientFrame extends javax.swing.JFrame {

/**
 * Creates new form AddClientGUI
 */
private ClientsManager clientmanager;
private InsuranceManager insurancemanager;

public ClientFrame() {
    initComponents();
    clientmanager = new ClientsManager();
    clientmanager.printList();
    updateComboBoxCompany();
    updateComboBoxInsurance();
}

private ClientsManager clientmanager;
private InsuranceManager insurancemanager;

public ClientFrame() {
    initComponents();
    clientmanager = new ClientsManager();
    clientmanager.printList();
    updateComboBoxCompany();
    updateComboBoxInsurance();
}

public void updateComboBoxCompany() 
{
    for (Object object : insurancemanager.getCompanyNames()) 
    {
        companyComboBox.addItem(object);
    }   
}

public void updateComboBoxInsurance() 
{
    for (Object object : insurancemanager.getPolicyNames()) 
    {
        insuranceComboBox.addItem(object);
    }   
}
以下是使用的方法:

public Object[] getCompanyNames() 
{
    ArrayList<String> cnames = new ArrayList<String>();
    for (InsurancesCompany company : insurancecompanyList) 
    {
        cnames.add(company.getCompanyName());
    }
    return cnames.toArray();
}

public Object[] getPolicyNames() 
{
    ArrayList<String> vnames = new ArrayList<String>();
    for (Insurance insurance : insuranceList) 
    {
        vnames.add(insurance.getPolicyName());
    }
    return vnames.toArray();
}

我只看到您使用变量,但对我来说,它们没有初始化。所以它们是空的,你得到一个NPE

那么
verzekeringmaatschapijlijst
verzekeringLijst
是如何初始化的呢?

  • 所有数据

  • 设置适当的
    对象
    类型(
    字符串
    整数
    图标
    或简单的
    对象
    ),Java7实现泛型,有

  • 所有更新(对
    JComboBox
    或其
    型号的更新)必须在


您从未初始化
verzekeringBeheer
,因此,当您尝试调用该变量上的方法时,会得到
NullPointerException

您的构造函数中应该有这样的内容:

verzekeringbeheer = new VerzekeringBeheer();
另外,尽量避免使代码与代码的其他部分耦合。例如:

public VerzekeringBeheer() {
    ...
    //verzekeringmaatschappijLijst is never initialized!!!
}

public void maakLijstAan() 
{
    verzekeringmaatschappijLijst = new Lijst<>();
    System.out.println("Maak lijst aan");
}

public Object[] getMaatschappijNamen() 
{
    ArrayList<String> mnamen = new ArrayList<String>();
    // Here you use verzekeringmaatschappijLijst without checking that is not null!!!
    for (VerzekeringsMaatschappij maatschappij : verzekeringmaatschappijLijst) 
    {
        mnamen.add(maatschappij.getMaatschappijNaam());
    }
    return mnamen.toArray();
}
public-VerzekeringBeheer(){
...
//VerzekeringMaatschapijlijst从未初始化!!!
}
公共无效maakLijstAan()
{
Verzekeringmaatschapijlijst=新的Lijst();
系统输出打印(Maak lijst aan);
}
公共对象[]GetMaatschapijNamen()
{
ArrayList mnamen=新的ArrayList();
//在这里,您使用verzekeringmaatschapijlijst而不检查它是否为空!!!
对于(VerzekeringMaatschapij-Maatschapij:VerzekeringMaatschapijst)
{
mnamen.add(maatschapij.getmaatschapijnaam());
}
返回mnamen.toArray();
}

如果没有人调用
maakLijstAan
,您将在
getMaatschappijNamen
中获得
NullPointerException
。尽量避免使用依赖于外部代码的代码,以便运行时不会出现问题。

如果您告诉我们您在哪里获得NPE,这也会有所帮助。这些变量中的名称到底是什么?使用一些CamelCase和更短的名称!2我用这行代码获得NPE:for(Object:verzekeringbeheer.getMaatschappijNamen())1)要更快地获得更好的帮助,请发布一个。2) 由于英语是编程和站点的默认语言,并且变量名具有指导意义,因此请使用英语(以及使用CamelCase等)来命名变量。@Forza:如果您获得NPE,则verzekeringbeheer为空。因为我们没有这部分代码,所以不可能判断出什么是错误的。我现在将把它添加到OP中。请参见中显示的对比示例。这里有很多信息!谢谢你,我现在就过去;)我有一个MainGUI类,它调用maakLijstAan(createNewList)。现在将其添加到OP中。@Forza我确信您在某个地方调用了该方法。我只是说,通过选择这样的代码模式,您正在寻找麻烦,代码紧密耦合,代码维护困难。无论如何,您最初的问题仍然是一样的,您从来没有实例化过
verzekeringBeheer
@Forza,也不会在InsuranceManager类中删除那些
静态
关键字。它们是不必要的,因为没有初始化verzekeringBeheer而麻烦重重。。我现在想跳出窗口…还有一件事:静态关键字是必要的,因为如果我离开它们,我会得到另一个NPE。现在我有一个组合框工作,一个不工作。InsuranceComboBox未加载任何值
verzekeringbeheer = new VerzekeringBeheer();
public VerzekeringBeheer() {
    ...
    //verzekeringmaatschappijLijst is never initialized!!!
}

public void maakLijstAan() 
{
    verzekeringmaatschappijLijst = new Lijst<>();
    System.out.println("Maak lijst aan");
}

public Object[] getMaatschappijNamen() 
{
    ArrayList<String> mnamen = new ArrayList<String>();
    // Here you use verzekeringmaatschappijLijst without checking that is not null!!!
    for (VerzekeringsMaatschappij maatschappij : verzekeringmaatschappijLijst) 
    {
        mnamen.add(maatschappij.getMaatschappijNaam());
    }
    return mnamen.toArray();
}