Java NullPointerException与侦听器并在单击按钮时创建对象

Java NullPointerException与侦听器并在单击按钮时创建对象,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我对下面的代码有一些问题。它运行,但给我一个错误提示: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at controlador.Arbitros_controlador.actionPerformed(Arbitros_controlador.java:125) at javax.swing.JComboBox.fireActionEvent(Unknown Source) at javax.sw

我对下面的代码有一些问题。它运行,但给我一个错误提示:

 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at controlador.Arbitros_controlador.actionPerformed(Arbitros_controlador.java:125)
at javax.swing.JComboBox.fireActionEvent(Unknown Source)
at javax.swing.JComboBox.setSelectedItem(Unknown Source)
at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
at javax.swing.JComboBox.selectWithKeyChar(Unknown Source)
at javax.swing.plaf.basic.BasicComboBoxUI$Handler.keyPressed(Unknown Source)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at javax.swing.JComboBox.processKeyEvent(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.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(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$200(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$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.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$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)
我认为obj还没有实例化,但是从
if语句的逻辑来看,它不应该抛出这个错误,并且已经以我能想到的任何方式对它进行了更改,但是它仍然抛出错误,请帮助。我的代码是:

这是视图类:

package vista;

import java.awt.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import javax.swing.*;

@SuppressWarnings("serial")
public class Arbitros_vista extends JPanel {

public JPanel panel_arbitroNuevo, panel_arbitroInfo, pnombre,
        pnacionalidad, ppartidos, pposicion;
public JTable lista_arbitros;
public JButton partidosAsignados, crear_Arbitro, b3;
public JTextField nombre, nacionalidad, posicion;
public JLabel labelNombre, labelNacionalidad, labelPosicion;
public JComboBox<Integer> opcionesLista;

DateFormat formatoFecha = new SimpleDateFormat("dd-mm-yyyy");

JFormattedTextField entradaFecha = new JFormattedTextField(formatoFecha);
private JLabel amountOfGames;

// constructor creates all components inside the mainWindow tabs
public Arbitros_vista() {

    this.setPanel_nuevo_Arbitro();
    this.crearTablaDeArbitros();
    this.setBackground(new Color(200, 200, 200));

    this.add(this.panel_arbitroNuevo);
    this.add(this.panel_arbitroInfo);

}

public void setPanel_nuevo_Arbitro() {

    panel_arbitroNuevo = new JPanel();

    panel_arbitroNuevo.setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createLineBorder(new Color(150, 150, 150),      20),
            "Nuevo Arbitro"));

    panel_arbitroNuevo.setLayout(new GridBagLayout());

    GridBagConstraints gbc = new GridBagConstraints();
    // creacion del label nommbre con su entrada de texto y ubicacion
    // ====================================================================================================

    labelNombre = new JLabel("Nombre:");
    nombre = new JTextField(7);

    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);

    panel_arbitroNuevo.add(labelNombre, gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);
    panel_arbitroNuevo.add(nombre, gbc);

    // creacion del label nacionalidad con su entrada de texto y ubicacion
    // ====================================================================================================

    labelNacionalidad = new JLabel("Nacionalidad:");
    nacionalidad = new JTextField(7);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);
    panel_arbitroNuevo.add(labelNacionalidad, gbc);

    gbc.gridx = 1;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);
    panel_arbitroNuevo.add(nacionalidad, gbc);

    // creacion de label posicion con su entrada de texto y ubicacion
    // ====================================================================================================

    labelPosicion = new JLabel("Posición:");
    posicion = new JTextField(7);

    gbc.gridx = 0;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);
    panel_arbitroNuevo.add(labelPosicion, gbc);

    gbc.gridx = 1;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);
    panel_arbitroNuevo.add(posicion, gbc);



    // creacion de DropDown list que contiene opciones para la cantidad de         partidos asignados
    // ====================================================================================================

    amountOfGames = new JLabel("Partidos Asignados");

    gbc.gridx = 3;
    gbc.gridy = 0;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    panel_arbitroNuevo.add(amountOfGames, gbc);

    Integer[] options = {0,1,2,3,4,5,6,7,8,9};

    gbc.gridx = 3;
    gbc.gridy = 1;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;

    opcionesLista = new JComboBox<Integer>(options);
    opcionesLista.setSelectedIndex(0);
    opcionesLista.setEditable(false);

    panel_arbitroNuevo.add(opcionesLista, gbc);



    // creacion de boton partidos asignados con su ubicacion
    //         ===========================================================================================      =========

    partidosAsignados = new JButton("Partidos Asignados");

    gbc.gridx = 0;
    gbc.gridy = 3;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);
    panel_arbitroNuevo.add(partidosAsignados, gbc);

    // creacion de boton CREAR ARBITRO con su ubicacion
    // ==============================================================

    crear_Arbitro = new JButton("Crear");

    gbc.gridx = 3;
    gbc.gridy = 3;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5, 5, 5, 5);
    panel_arbitroNuevo.add(crear_Arbitro, gbc);

}// end of setPanel_nuevo_Arbitro method

public void crearTablaDeArbitros() {

    panel_arbitroInfo = new JPanel();
    panel_arbitroInfo.setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createLineBorder(new Color(0, 0, 0)),
            "Información Arbitros"));
    panel_arbitroInfo.setLayout(new GridBagLayout());

    @SuppressWarnings("unused")
    String x = "VS";
    String[] cols = { "Nombre", "Nacionalidad", "Posicion",
            "Partidos Asignados" };
    String[][] rows = { { "esteban rincon", "colombiano",
            "lateral izquierdo", " Ver " } };

    lista_arbitros = new JTable(rows, cols);
    JScrollPane scrol = new JScrollPane(lista_arbitros);
    lista_arbitros.setFillsViewportHeight(false);

    panel_arbitroInfo.add(scrol);

}


}
这就是抛出错误的控制器:

  package controlador;

 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.EventListener;

 import javax.swing.JOptionPane;

import modelo.Arbitros_modelo;
import modelo.Arbitros_modelo_sub;
import vista.Arbitros_vista;
import vista.Arbitros_vista_sub;

public class Arbitros_controlador implements ActionListener {

private Arbitros_vista VISTA;
@SuppressWarnings("unused")
private Arbitros_modelo MODELO;
private Arbitros_vista_sub vistaSub;
@SuppressWarnings("unused")
private Arbitros_modelo_sub modeloSub;
@SuppressWarnings("unused")
private String inputOne;
@SuppressWarnings("unused")
private String inputTwo;
private String nombrE;
private String nacionalidaD;
private String posicioN;
private int counter;

/**
 * Constructor creates a link between all GRAPHICAL INTERFACES AND BACK END|
 * PROCESS
 * 
 * @param vista
 * @param vistasub
 * @param modelo
 * @param modeloSub
 */

public Arbitros_controlador(Arbitros_vista vista,
        Arbitros_vista_sub vistasub, Arbitros_modelo modelo,
        Arbitros_modelo_sub modeloSub) {

    this.VISTA = vista;
    this.vistaSub = vistasub;
    this.MODELO = modelo;
    this.modeloSub = modeloSub;

    this.VISTA.partidosAsignados.addActionListener(this);
    this.VISTA.crear_Arbitro.addActionListener(this);
    this.VISTA.nombre.addActionListener(this);
    this.VISTA.nacionalidad.addActionListener(this);
    this.VISTA.posicion.addActionListener(this);
    this.VISTA.opcionesLista.addActionListener(this);

}

@Override
public void actionPerformed(ActionEvent e) {
    counter = (int) this.VISTA.opcionesLista.getSelectedItem();
    if(e.getSource() == this.VISTA.crear_Arbitro){
        nombrE = this.VISTA.nombre.getText();
        nacionalidaD = this.VISTA.nacionalidad.getText();
        posicioN = this.VISTA.posicion.getText();
        this.MODELO = new Arbitros_modelo(nombrE, nacionalidaD, posicioN, counter); // CREATES ARBITRO

        this.MODELO.intoARBITROS_TABLE();
}

    // seeks PARTIDOS ASIGNADOS'S BUTTON
    // ====================================================================================================================================
    if (e.getSource() == VISTA.partidosAsignados) {




        // input validation
        // ====================================================================================================================================

        if (nombrE.equals("") || nombrE.equals(null)
                || nacionalidaD.equals("") || nacionalidaD.equals(null)
                || posicioN.equals("") || posicioN.equals(null)
                || counter == 0) {

            JOptionPane
                    .showMessageDialog(
                            null,
                            "Información del árbitro Incompleta.\n Debe llenar datos primarios"
                                    + " del árbitro antes de continuar con los partidos asignados.");

        } else {






            this.vistaSub = new Arbitros_vista_sub(nombrE);
            this.vistaSub.equTxt.addActionListener(this);
            this.vistaSub.equ2Txt.addActionListener(this);
            this.vistaSub.ok.addActionListener(this);

            this.modeloSub = new Arbitros_modelo_sub(nombrE);

            // end of SUB- VISTA - IF-STATEMENT

        }

        // ====================================================================================================================================================================================

    } else {

        // IF MAIN BUTTON ISN'T CLICKED DO NOTHING
        // ***********************************************************************

    }// END OF first if statement seeks PARTIDOS ASIGNADOS'S BUTTON

    // TODO need to check why its throwing a NullPointerException in next
    // line everytime you pass from and to the JComboBox which gives the
    // option to use X number to create X windows
    // to insert into a ARBITRO_TABLE
    // SEEKS OK BUTTON FOR SUB-VISTA JFRAME
    // ============================================================================================================================================
    if (e.getSource() == this.vistaSub.ok) {

        inputOne = this.vistaSub.equTxt.getText();
        inputTwo = this.vistaSub.equ2Txt.getText();

        // INPUT VALIDATION FOR INNER SUB-VISTA JFRAME COMPONENTS

        if (inputOne.equals("") || inputOne.equals(null)
                || inputOne.equals(" ") || inputTwo.equals("")
                || inputTwo.equals(null) || inputTwo.equals(" ")) {

            JOptionPane.showMessageDialog(null, "Ingrese ambos equipos");

        } else {

            this.modeloSub.intoTable(inputOne, inputTwo);
            this.vistaSub.closeFrame();

        }// END OF INPUT VALIDATION FOR INNER SUB-VISTA JFRAME COMPONENTS

    } else {

    }



}

}
这就是控制一切的地方:

import javax.swing.JFrame;

 import modelo.Arbitros_modelo;
import modelo.Arbitros_modelo_sub;
import vista.Arbitros_vista;
import vista.Arbitros_vista_sub;
import controlador.Arbitros_controlador;

public class TESTER_ARBITROS {

        public static void main(String[] args) {

            Arbitros_vista vista = new Arbitros_vista();
            Arbitros_vista_sub vistaSub = null;
            Arbitros_modelo modelo = null;
            Arbitros_modelo_sub modeloSub = null;

                Arbitros_controlador arbitro = new   Arbitros_controlador(vista, vistaSub, modelo, modeloSub);

            javax.swing.JFrame  frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                
            frame.add(vista);
            frame.pack();
            frame.setVisible(true);

        }
}
还有另一个类是当单击按钮时创建的
JFrame
,但不认为它相关

at controlador.Arbitros_controlador.actionPerformed(Arbitros_controlador.java:125)
表示在Arbitros_controlador.java中的第125行存在NullPointerException;哪条线

if (e.getSource() == this.vistaSub.ok) {

因此,我假设
e.getSource()
返回null(这不太可能),或者
this.vistaSub.ok
为null(这是我所期望的)。

在主方法中,您有:

Arbitros_vista_sub vistaSub = null;
...
Arbitros_controlador arbitro = new   Arbitros_controlador(vista, vistaSub, modelo, modeloSub);
您确定要进入方法的
else
条件
actionPerformed

this.vistaSub = new Arbitros_vista_sub(nombrE);
如果没有,那么您就知道为什么会有NullPointerException

要处理此类NullPointerException,可以在生成NPE的行之前添加以下行:

if (this.vistaSub == null) {
    this.vistaSub = new Arbitros_vista_sub(nombrE);
}

为了更快地获得更好的帮助,请发布一个(最简单的完整且可验证的示例)。这有点笼统,但正确。我更愿意参考。@AndrewThompson,谢谢你的提示,我下次会这样做。谢谢,如果我想在这个按钮上创建对象,我该如何处理这个错误?有没有办法处理这个错误?
if (this.vistaSub == null) {
    this.vistaSub = new Arbitros_vista_sub(nombrE);
}