Author Topic: Problema con NullPointerExcepcion  (Read 3137 times)

mkeydiluffy

  • Newbie
  • *
  • Posts: 14
  • Karma: 0
    • View Profile
Problema con NullPointerExcepcion
« on: Agosto 25, 2012, 11:33:32 pm »
Hola buenas tardes, resulta que tengo unos fallos que me estan volviendo loco, porque no hay manera de saber que es lo que pasa o de donde vienen y me estoy estrujando los sesos y no hay manera, os comento.

El principal problema es que tengo una aplicacion se ejecuta, aunque con advertencia, y tengo un JMenuBar dentro de el tengo varios menus con sus pestañitas, pues resulta que cuando le doy a un que es "Nuevo Coche" ( el programa es una tienda de coches) me sale esto:

Code: [Select]
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ucam.aplicacion.Coches.NuevoCoche.getClaseCoche(NuevoCoche.java:168)
at ucam.aplicacion.Coches.NuevoCoche.getPanelAddCoche(NuevoCoche.java:103)
at ucam.aplicacion.Coches.NuevoCoche.getPanelPrincipal(NuevoCoche.java:81)
at ucam.aplicacion.Coches.NuevoCoche.<init>(NuevoCoche.java:68)
at ucam.VentanaPrincipal.BarraMenu.actionPerformed(BarraMenu.java:78)
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.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.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$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)

Yo tengo implementado en el JMenuBar que cuando le de a este boton me crea un nuevo objeto de la clase Nuevo Coche y en su constructor tengo una ventana para que se abra y asi poder poner las caracteristicas del coche, pero claro no se abre.
Se que lo de nullpointerexception pasa cuando un objeto esta invocado vacio pero no entiendo porque no se ejecuta la ventana.
De todos modos os pongo el codigo que me marca ahy la excepcion:

public class NuevoCoche implements ActionListener {

   
   //objetos del coche
   Coche coche;
   PanelEspecificaciones panelEspecificaciones;
   String matricula;
   String marca;
   String modelo;
   String color;
   String tipoMotor;
   String concesionario;
   String clase = "Berlina";
   
   JComboBox sucursalConcesionario;
   JTextField matriculaCoche;
   JTextField marcaCoche;
   JTextField modeloCoche;
   JComboBox carburanteCoche;
   JComboBox claseCoche;
   
JPanel panelPrincipal = new JPanel();
   
   
   //Metodo constructor que nos inicializa la ventana secundaria.
   
   public NuevoCoche() {
      sucursalConcesionario = new JComboBox();
      sucursalConcesionario.setName("sucursalConcesionario");
      matriculaCoche = new JTextField(10);
      matriculaCoche.setName("matriculaCoche");
      marcaCoche = new JTextField(10);
      marcaCoche.setName("marcaCoche");
      modeloCoche = new JTextField(10);
      modeloCoche.setName("modeloCoche");
      carburanteCoche = new JComboBox();
      carburanteCoche.setName("carburanteCoche");
      claseCoche = new JComboBox();
      claseCoche.setName("claseCoche");
      
      JDialog ventanaAddCoche = new JDialog();      
      ventanaAddCoche.setTitle("Nuevo Coche");
                ventanaAddCoche.setContentPane(getPanelPrincipal());
           ventanaAddCoche.setModal(true);
      ventanaAddCoche.pack();
      ventanaAddCoche.setLocationRelativeTo(null);
      ventanaAddCoche.setVisible(true);
   
   }
   
   //Panel principal que contendra el panel de campos y el panel del boton agregar
   
      public JPanel getPanelPrincipal(){
         panelPrincipal.setLayout(new BoxLayout(panelPrincipal,BoxLayout.PAGE_AXIS));
      //   panelPrincipal.add(getPanelLabel());
         panelPrincipal.add(getPanelAddCoche());
         panelPrincipal.add(getJpanelEspecificaciones());
         panelPrincipal.add(getPanelAddCocheBoton());
         panelPrincipal.setBorder(BorderFactory.createEmptyBorder(15,15,15,15));
         return panelPrincipal;
      }
   
      //Panel(NORTE)
      
      public JPanel getPanelAddCoche(){
         JPanel panelAddCoche = new JPanel();
         panelAddCoche.setLayout(new GridLayout(0,2));
         panelAddCoche.add(new JLabel("Sucursal"));
         panelAddCoche.add(getSucursalConcesionario());
         panelAddCoche.add(new JLabel("Matricula"));
         matriculaCoche.addActionListener(this);
         panelAddCoche.add(matriculaCoche);
         panelAddCoche.add(new JLabel("Marca"));
         panelAddCoche.add(marcaCoche);
         panelAddCoche.add(new JLabel("Modelo"));
         panelAddCoche.add(modeloCoche);
         panelAddCoche.add(new JLabel("Clase"));
         panelAddCoche.add(getClaseCoche());
         panelAddCoche.add(new JLabel("TipoMotor"));
         panelAddCoche.add(getTipoMotor());
         panelAddCoche.setBorder(BorderFactory.createEmptyBorder(15,15,0,15));
         
      return panelAddCoche;
      }
      
      public JPanel getJpanelEspecificaciones(){
         
         JPanel jpanelEspecificaciones = new JPanel();
         jpanelEspecificaciones.setLayout(new GridBagLayout());
         
         // Ahora mostramos el panel necesario
         try {
            String ClaseEspecifica = "ucam.aplicacion.Coches.PanelEspecificaciones"+clase; // Ligadura dinamica
            panelEspecificaciones = (PanelEspecificaciones) Class.forName(ClaseEspecifica).newInstance();
         } catch (InstantiationException e) {
            
            e.printStackTrace();
         } catch (IllegalAccessException e) {
         
            e.printStackTrace();
         } catch (ClassNotFoundException e) {
            
            e.printStackTrace();
         }
         jpanelEspecificaciones.add(panelEspecificaciones.getPanelEspecificaciones());
         
         return jpanelEspecificaciones;   
         
      }
      
      //Generamos los JCombo Box
      
      public JComboBox getSucursalConcesionario() {
         

         if (sucursalConcesionario.getItemCount() == 0){
            
            //Los atributos que se cargaran en el JComboBox los extraemos del fichero concesionarios
            
            GestionarConcesionario gCon = new GestionarConcesionario();
            Hashtable hashConcesionarios = gCon.reCargar();
            
            for(Enumeration e = hashConcesionarios.keys(); e.hasMoreElements();){
               Object obj = e.nextElement();
                sucursalConcesionario.addItem(obj);
            }   
         }
            sucursalConcesionario.addActionListener(this);
            return sucursalConcesionario;
      }
      
      
      @SuppressWarnings("unchecked")
      public JComboBox getClaseCoche() {
         

         if (claseCoche.getItemCount() == 0){
            
            //Los atributos que se cargaran en el JComboBox los extraemos del fichero propiedades
            
            GestionarPropiedades gP = new GestionarPropiedades();
            String posiciones = gP.sacarClases();
            String[] arrayPosiciones = posiciones.split(" ");
                     
               for(int i = 0 ;i<arrayPosiciones.length ; i++){
                  claseCoche.addItem(arrayPosiciones);
               }
         }
            claseCoche.addActionListener(this);
            return claseCoche;
      }


      public JComboBox getTipoMotor() {
         if (carburanteCoche.getItemCount() == 0){      
            carburanteCoche.addItem("Gasolina");
            carburanteCoche.addItem("Diesel");
            carburanteCoche.addItem("Bio-Diesel");
            carburanteCoche.addItem("Hibrido");
         }
         
         return carburanteCoche;
         
      }
      
      //Panel del Boton agregar con el mismo incluido (SUR)
      
      public JPanel getPanelAddCocheBoton(){
         JPanel panelAddCocheBoton = new JPanel();
         JButton botonAceptar = new JButton("Aceptar");
         panelAddCocheBoton.setLayout(new GridLayout(1,1));
         panelAddCocheBoton.add(botonAceptar);
         
         
         ActionListener listener = new ActionListener(){
         
         

            
             public void actionPerformed(ActionEvent e) {
               
               concesionario = sucursalConcesionario.getSelectedItem().toString();
               matricula = matriculaCoche.getText().toString();
               System.out.println(matricula);
               marca = marcaCoche.getText().toString();
               modelo = modeloCoche.getText().toString();
               clase = claseCoche.getSelectedItem().toString();
               tipoMotor = carburanteCoche.getSelectedItem().toString();
               //******************************************************
               // Comprobamos si la matricula existe.
               Hashtable<String,Coche> coch = GestionarCoche.reCargar();
               Enumeration<String> en=coch.keys();
               String m=null;
               if(en.hasMoreElements()){
                  m=en.nextElement();
               }
               while(m!=null && m.compareTo(matricula)!=0 && en.hasMoreElements()){
                   m=en.nextElement();
               }
               
               if(m==null || m.compareTo(matricula)!=0){
               //*******************************************************
                  try {
                        coche = (Coche) Class.forName("ucam.aplicacion."+clase).newInstance(); // Ligadura dinamica
                     } catch (InstantiationException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                     } catch (IllegalAccessException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                     } catch (ClassNotFoundException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                     }
                     
                          coche.agregarAtributos(concesionario, matricula, marca,  modelo, clase, tipoMotor, panelEspecificaciones);
                     
                     //Creamos el ArrayList que contendra las especificaciones,
                     
                     ArrayList<Integer> listaEspecificaciones = new ArrayList<Integer>();
                     int especificacion1 = Integer.parseInt(panelEspecificaciones.especificacion1Coche.getText().toString());
                     
                     listaEspecificaciones.add(especificacion1);
                  
                     coche.agregarAtributos(listaEspecificaciones);
                     coche.guardarCoche(coche);
                     coche.sacarAtributos();
                     JOptionPane.showMessageDialog(null, marca + modelo +" ha sido agregado al concesionario ", "Nuevo Coche", JOptionPane.INFORMATION_MESSAGE);               
                  }
                 else{
                     JOptionPane.showMessageDialog(null, "Esta matricula ya existe","Introduzca otra distinta", JOptionPane.OK_OPTION);
                 }
             }
         
            
          };
      
          botonAceptar.addActionListener(listener);
         
         
               
         return panelAddCocheBoton;
         
      }

      @Override
      public void actionPerformed(ActionEvent actionEvent) {
         
         //Este metodo le da funcionalidad al JcomboBox
         //Recoge el valor selecionado en el ComboBox para volver a pintar el
         //panelPrincipal con su consiguiente instanciacion del Panel de Especificaciones
         
         
         if (actionEvent.getSource() == claseCoche){
            clase = claseCoche.getSelectedItem().toString();
            panelPrincipal.removeAll();
            panelPrincipal.setLayout(new BoxLayout(panelPrincipal,BoxLayout.PAGE_AXIS));
   //         panelPrincipal.add(getPanelLabel());
            panelPrincipal.add(getPanelAddCoche());
            panelPrincipal.add(getJpanelEspecificaciones());
            panelPrincipal.add(getPanelAddCocheBoton());
            panelPrincipal.updateUI();
         }
         else if (actionEvent.getSource() == matriculaCoche){
            claseCoche.requestFocus();
         }   
                  
            
      }
      
}


En lo que esta rojo es donde me salta cuando pulso en los fallos que me aparecen, lo que he ido haciendo es recorriendo la accion desde que pulso el boton hasta que se tiene que abrir la ventana y no veo nada mal, a ver si pudieran ayudarme porque me estoy volviendo loco sin saber que ocurre, gracias de antemano a todos.

PD: Perdonarme por no poner como codigo todo el codigo, pero es que queria poner en color donde me da el fallo y como codigo no me dejaba, y  si no me explico bien es que soy novatillo en java aun.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problema con NullPointerExcepcion
« Reply #1 on: Agosto 26, 2012, 02:20:21 am »
Hola:

Mirando el error el problema está en la línea 168 de la clase NuevoCoche.java. ¿Cual es exactamente esa línea?. Si has modificado el código, vuelve a ejecutar y mira en la excepción la nueva línea

at ucam.aplicacion.Coches.NuevoCoche.getClaseCoche(NuevoCoche.java:168)

Se bueno

mkeydiluffy

  • Newbie
  • *
  • Posts: 14
  • Karma: 0
    • View Profile
Re: Problema con NullPointerExcepcion
« Reply #2 on: Agosto 26, 2012, 02:31:29 am »
Si mira precisamente e puesto en rojo las lineas donde me da el fallo tanto el primero como los demas

Code: [Select]
if (claseCoche.getItemCount() == 0){

//Los atributos que se cargaran en el JComboBox los extraemos del fichero propiedades

        GestionarPropiedades gP = new GestionarPropiedades();
String posiciones = gP.sacarClases()
                  String[] arrayPosiciones = posiciones.split(" ");     ----> En esta linea es donde me da el primer fallo


El tema es que no se donde esta el fallo en la linea, lo veo todo bien y eso es lo que me esta matando, porque no se que es lo que no esta funcionando. A ver si se os ocurre algo que de el error.
El siguente fallo es el que esta justo antes del que te he dicho y el siguente antes de éste y asi.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problema con NullPointerExcepcion
« Reply #3 on: Agosto 26, 2012, 03:13:21 pm »
Si te de nullpointerexception y es esa línea, la única posibilidad es que posiciones es null. Mira a ver qué te está devolviendo en la línea anterior el método gp.sacarClases()

Se bueno

mkeydiluffy

  • Newbie
  • *
  • Posts: 14
  • Karma: 0
    • View Profile
Re: Problema con NullPointerExcepcion
« Reply #4 on: Agosto 26, 2012, 08:08:27 pm »
Muchas gracias ya encontre el fallo es que en el archivo propiedades tenia puesto clases= berlina todoterreno .... y en el codigo clase entonces no encontraba el string de las clases , muchas gracias de verdad, ahora me toca seguir probando que seguro que habra algun fallo por hay mas.

A ver si me puedes echar una mano tambien con este fallo pulso un boton que me tiene que salir una ventana y me sale en la consola esto: Marca: nullModelo :nullEspecificaciones: [] nada mas y claro no sale la ventana, supuestamente el boton es de eliminar de un hashtable un objeto y no se porque sale eso de null porque el hash contiene coches. A ver si sabes que puedo hacer, gracias.
« Last Edit: Agosto 26, 2012, 08:44:14 pm by mkeydiluffy »

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problema con NullPointerExcepcion
« Reply #5 on: Agosto 27, 2012, 03:27:38 pm »
Pues es null tanto marca como modelo. Especificaciones es un array sin elementos. No estaría de más que pusieras el código de cómo intentas obtener esos datos y cómo rellenas el hash y si crees que ambas cosas están bien, revisa que no tengas sin querer dos hash (dos news del hash).

Se bueno.

mkeydiluffy

  • Newbie
  • *
  • Posts: 14
  • Karma: 0
    • View Profile
Re: Problema con NullPointerExcepcion
« Reply #6 on: Agosto 27, 2012, 06:34:56 pm »
Te pongo el codigo donde tengo hecho como elimino un coche:

Code: [Select]
public class BorrarCoche extends JDialog implements ActionListener {

/**
*
*/
private static final long serialVersionUID = 1L;

public JComboBox coche = new JComboBox();

//Metodo constructor que nos inicializa la ventana secundaria.

public BorrarCoche() {

this.setLocationRelativeTo(null);
this.setTitle("Borrar Coche");
this.setContentPane(getPanelPrincipal());
this.setModal(true);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);

}


//Panel principal que contendra el panel de campos y el panel del boton a�adir

private JPanel getPanelPrincipal(){
JPanel panelPrincipal = new JPanel();
panelPrincipal.setLayout(new BorderLayout());
panelPrincipal.add(getPanelEliCoche(),BorderLayout.CENTER);
panelPrincipal.add(getPanelEliCocheBoton(),BorderLayout.SOUTH);
panelPrincipal.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

return panelPrincipal;
}

//Panel de Campos (NORTE)

public JPanel getPanelEliCoche(){

JPanel panelEliCoche = new JPanel();
panelEliCoche.setLayout(new GridLayout(0,2));
panelEliCoche.add(new JLabel("Matricula"));
panelEliCoche.add(getCampoCoche());
panelEliCoche.setBorder(BorderFactory.createEmptyBorder(15,15,15,15));
return panelEliCoche;
}


public JComboBox getCampoCoche() {

GestionarCoche gC = new GestionarCoche();
Hashtable hashCoches = gC.reCargar();

for(Enumeration e = hashCoches.keys(); e.hasMoreElements();){

    Object obj = e.nextElement();
   
coche.addItem(obj);

}

return coche;

}

//Panel del Boton agregar con el mismo incluido (SUR)

public JPanel getPanelEliCocheBoton(){

JPanel panelEliCocheBoton = new JPanel();
JButton botonEliminar = new JButton("Borrar Coche");
panelEliCocheBoton.setLayout(new GridLayout(1,1));
panelEliCocheBoton.add(botonEliminar);


ActionListener listener = new ActionListener(){

public void actionPerformed(ActionEvent e) {

String matricula = coche.getSelectedItem().toString();
          int confirmado = JOptionPane.showConfirmDialog(null,"¿Deseas borrar el coche "+matricula+"?","Borrar coche" ,JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (JOptionPane.OK_OPTION == confirmado){
                 GestionarCoche.borrarDelFichero(matricula);
}
     }
      };
 
      botonEliminar.addActionListener(listener);

return panelEliCocheBoton;

}


@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}


}

Lo unico que se me ocurre es que no me detecte el hashtable y por eso dice que esta vacio, pero miro el nombre y es el mismo que tengo en los demas sitios.
Utilizo la matricula para seleccionar el coche que quiero borrar. A ver si encuentras algo, porque yo no veo nada y estoy comparando con otras clases que tambien utilizan el hash y mas o menos esta igual implementado.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problema con NullPointerExcepcion
« Reply #7 on: Agosto 28, 2012, 03:30:13 pm »
Complicado.

Al final no sé si tu problema es que te muestra unos null en marca y modelo como decías en el post anterior, o que no te borra del hash. Tampoco puedo ver cómo borras si el borrado llama a un método  GestionarCoche.borrarDelFichero(matricula) del que tampoco pones el código.

Arranca la aplicación con debugger (netbeans o eclipse tienen debugger) y vete siguiéndola paso a paso. En cualquier caso, si como el nombre indicar, borrarDelFichero() borra de un fichero, en pantalla no verás el borrado salvo que borres todo y recargues de nuevo el fichero.

Se bueno.

mkeydiluffy

  • Newbie
  • *
  • Posts: 14
  • Karma: 0
    • View Profile
Re: Problema con NullPointerExcepcion
« Reply #8 on: Agosto 29, 2012, 08:24:54 pm »
Ya lo solucione era que en el metodo donde llamaba a la ventana para que se ejecutara habia puesto el nombre mal y claro pos daba null.
Es que esto del java la minima cosa que no tengas bien da fallo, gracias por todo me a servido de mucha ayuda, ya pondre algun fallo mas seguro porque me queda aun algo por hacer,

patogreco

  • Newbie
  • *
  • Posts: 1
  • Karma: 0
    • View Profile
    • Tienda de accesorios para coches
Re: Problema con NullPointerExcepcion
« Reply #9 on: Julio 27, 2020, 07:48:07 am »
Ami me paso exactamente lo mismo

 

ey