0

PROBLEM

My code throws a NULL POINTER EXCEPTION when getting value from my Model in ModelDraftContract.java

Below is the error I get when a button triggers the event.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
       at control.TaskListListener.actionPerformed(TaskListListener.java:31)
       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$500(Unknown Source)
       at java.awt.EventQueue$3.run(Unknown Source)
       at java.awt.EventQueue$3.run(Unknown Source)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
       at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
       at java.awt.EventQueue$4.run(Unknown Source)
       at java.awt.EventQueue$4.run(Unknown Source)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.security.ProtectionDomain$JavaSecurityAccessImpl.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)

This is my code for my model. This is where I get the values from.

ModelContractDraft.java

public class ModelDraftContract {
    private String inputFile;
    private String selectedTask;

    public ModelDraftContract(){
        // constructor
    }
    public void setSelectedTask(String selectedTask) {
        this.selectedTask = selectedTask;
    }

    public String getSelectedTask() {
        return selectedTask;
    }
}

This is my GUI, I pass the value from JComboBox and JList using a constructor from SelectionList.java

ViewTaskList.java

public class ViewTaskList extends JFrame{
private JPanel mainPanel;
private JList<String> taskList;
private JLabel activityListLabel, taskLabel;
private final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
private JButton btnOk, btnCancel;
private JComboBox comboList;


public void createGUI(){
    setSize(600, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
    setLocationRelativeTo(null);
    setResizable(false);

    mainPanel = new JPanel(null);
    mainPanel.setPreferredSize(new Dimension(600,300));

    taskLabel = new JLabel("Choose a task");
    taskLabel.setBounds(400, 30, 100, 100);
    comboList = new JComboBox();
    comboList.setBounds(400, 100, 150, 30);
    comboList.setSelectedItem(null);


    DefaultListModel<String> JListModelTask = new DefaultListModel<>();
    JListModelTask.addElement("Create Draft Contract");
    //listModelTask.addElement("WTAAS");
    JListModelTask.addElement("Create VN Shell");
    //listModelTask.addElement("Prepare MES Invoice");

    activityListLabel = new JLabel("Activity");
    taskList = new JList<>(JListModelTask);
    taskList.addListSelectionListener(new SelectionList(comboList, taskList));

    taskList.setBorder(new LineBorder(Color.BLACK));
    activityListLabel.setBounds(50, 30, 100, 100);
    taskList.setBounds(50, 100, 150, 100);

    btnOk = new JButton("Ok");
    btnOk.setActionCommand("Ok");

    btnOk.addActionListener(new TaskListListener());
    btnOk.setBounds(150, 250, 70, 30);

    btnCancel = new JButton("Cancel");
    btnCancel.setActionCommand("Cancel");
    btnCancel.addActionListener(new TaskListListener());
    btnCancel.setBounds(350, 250, 100, 30);

    mainPanel.add(btnCancel);
    mainPanel.add(btnOk);
    mainPanel.add(taskLabel);
    mainPanel.add(comboList);
    mainPanel.add(activityListLabel);
    mainPanel.add(taskList);
    add(mainPanel);
    revalidate();
    pack();

}
public void initialize(){
    createGUI();
}
}

This code contains the actionListener from ViewTaskList.java

TaskListListener.java

public class TaskListListener implements ActionListener{
ModelDraftContract modelContract;
ViewTaskList tasklist;

public TaskListListener(ModelDraftContract modelContract){
    this.modelContract = modelContract;

}
public TaskListListener(){
}

@Override
public void actionPerformed(ActionEvent evt) {
    // TODO Auto-generated method stub
    if(evt.getActionCommand().equals("Run Vinny")){
        tasklist = new ViewTaskList();
        tasklist.initialize();
        tasklist.setVisible(true);
    }
    else if(evt.getActionCommand().equals("Ok")){
        // THROWS NULL POINTER EXCEPTION
        JOptionPane.showMessageDialog(null, modelContract.getSelectedTask());
    }
    else if(evt.getActionCommand().equals("Ok")){
        //ControllerDraftContract conDraft = new ControllerDraftContract();
        JOptionPane.showMessageDialog(null, "VN SHELL");
    }

}
}

This code implements ListSelectionListener in which I need the values based on the selected in JComboBox.

SelectionList.java

public class SelectionList implements ListSelectionListener{
private JComboBox comboList;
private JList<String> taskList;
private TaskListListener l;

public SelectionList(JComboBox comboList, JList<String> taskList){
    this.taskList = taskList;
    this.comboList = comboList;
}

public SelectionList() {

}

@Override
public void valueChanged(ListSelectionEvent arg0) {
    // TODO Auto-generated method stub
    ModelDraftContract modelContract = new ModelDraftContract();
    String selected = "";
    if(taskList.getSelectedIndex() == 0){
        comboList.removeAllItems();
        comboList.addItem("Prepare Contract");
        selected = comboList.getSelectedItem().toString();
    }
    else if(taskList.getSelectedIndex() == 1){
        comboList.removeAllItems();
        comboList.addItem("VN Shell(New)");
        comboList.addItem("VN Shell(Old)");
        selected = comboList.getSelectedItem().toString();

    }
    modelContract.setSelectedTask(selected);
}
}

I used JOptionPane for testing purposes, to see if I am getting the values right. But all I got was an error. I have been stuck in this problem and I don't know what's wrong with it. Any thoughts?

Hibari
  • 131
  • 16
  • You use `new TaskListListener()`, which means `modelContract` is null. – Mark Rotteveel Oct 26 '17 at 09:38
  • @MarkRotteveel which class? – Hibari Oct 26 '17 at 09:39
  • the == is not the proper operator to compare strings in java..... evt.getActionCommand() == "Ok" – MaVRoSCy Oct 26 '17 at 09:43
  • @MaVRoSCy oh yeah, better change that to `.equals()`. Thanks! – Hibari Oct 26 '17 at 09:43
  • 1
    Know your own code, in `ViewTaskList`, you have two statements: `btnOk.addActionListener(new TaskListListener());` and `btnCancel.addActionListener(new TaskListListener());` given your parameterless constructor of `TaskListListener` doesn't initialize `modelContract`, means it is null. – Mark Rotteveel Oct 26 '17 at 09:43
  • Yeap modelContract in the JOptionPane is not initialised... Thats the NullPointerException – MaVRoSCy Oct 26 '17 at 09:45
  • @MarkRotteveel I changed my code and passed the `modelContract` parameter to the constructor of `TaskListListener` and it still throws `NullPointerException` :( – Hibari Oct 26 '17 at 09:55

0 Answers0