Foro de elhacker.net

Programación => Java => Mensaje iniciado por: edr89 en 6 Diciembre 2015, 04:23 am



Título: NullPointerException al abrir ventana
Publicado por: edr89 en 6 Diciembre 2015, 04:23 am
Hola, buen día.

He buscado un poco acerca del error y todo apunta a que en alguna parte del código deberia haber un objeto pero se encuentra con un null y la aplicación truena.

La aplicación es muy sencilla y se pueden agregar autores a una base de datos en Derby, hay un boton que abre una ventana para dar de alta un Folder, y cada folder tiene asociado un Autor. Para poder dar de alta un Folder es necesario escribir el nombre del folder y despues el usuario da click en un boton que dice buscar, el boton debería abrir una ventana donde despliega la lista de autores que previamente hemos agregado, entonces se selecciona uno y se puede dar de alta un Folder.

El problema es que al dar click en buscar autor la aplicación falla y aparece el siguiente mensaje:
Código:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at mx.uam.ayd.negocio.ControlAgregarFolder.buscarAutor(ControlAgregarFolder.java:31)
at mx.uam.ayd.presentacion.VentanaAltaFolder$1.actionPerformed(VentanaAltaFolder.java:114)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Anteriormente teniamos la misma aplicacion pero las clases se llamaban Libros, solamente ajustamos los nombre y quitamos un campo que no necesitamos y al correr la aplicación esta fallando. El flujo es mas o menos el siguiente:

EL boton que dispara la accion para desplegarla ventana con autores es el siguiente:
Código
  1. /**
  2. * This method initializes jButtonBuscarAutor
  3. *
  4. * @return javax.swing.JButton
  5. */
  6. private JButton getJButtonBuscarAutor() {
  7.    if (jButtonBuscarAutor == null) {
  8.        jButtonBuscarAutor = new JButton();
  9.        jButtonBuscarAutor.setBounds(new Rectangle(347, 120, 86, 40));
  10.        jButtonBuscarAutor.setText("Buscar");
  11.        jButtonBuscarAutor.addActionListener(new java.awt.event.ActionListener() {
  12.            public void actionPerformed(java.awt.event.ActionEvent e) {
  13.                autor = control.buscarAutor();
  14.                if(autor != null) {
  15.                jLabelNombreAutor.setText(autor.toString()); //Muestra el nombre del autor actualmente seleccionado
  16.                }
  17.            }
  18.        });
  19.    }
  20.    return jButtonBuscarAutor;
  21. }

Y la clase control tiene el siguiente código:
Código
  1. public class ControlAgregarFolder {
  2. private DAOFolder DAOFolders;//libreria
  3. private DAOAutor DAOautores;
  4. private VentanaAltaFolder VentanaFolder;
  5.  
  6. public ControlAgregarFolder(DAOFolder DAOFolders, DAOAutor autores) {
  7.    this.DAOFolders = DAOFolders;
  8.    this.DAOautores = autores;
  9. }
  10.  
  11. public void inicia() {
  12.    VentanaFolder = new VentanaAltaFolder(this);
  13.    VentanaFolder.setVisible(true);
  14. }
  15.  
  16. public Autor buscarAutor() {
  17. //En la siguiente linea el programa esta fallando, cuando ejecuta DAOautores.dameAutores()
  18.    Autor arregloAutores[] = DAOautores.dameAutores(); // Obtiene lista de autores
  19.    DialogoSeleccionAutor dialogo = new DialogoSeleccionAutor(new JFrame(),arregloAutores);
  20. // Crea el dialogo con la lista de autores
  21.    dialogo.setVisible(true); // Muestra el dialogo
  22.    return dialogo.getAutorSeleccionado(); // Regresa el autor seleccionado en el dialogo
  23. }
  24.  
  25. public void agregarFolder(String nombre, Autor autor, String ruta) {
  26.    DAOFolders.agregaFolder(new Folder(nombre,autor,ruta));
  27. }
  28. }

Y donde se supone que esta fallando es en la linea que hace referencia al DAOAutor cuyo codigo es:
Código
  1. public Autor[] dameAutores() {
  2. ArrayList <Autor> autoresTemp = new ArrayList <Autor>();
  3. try {
  4. // Crea el statement
  5. Statement statement = ManejadorBD.dameConnection().createStatement();
  6. // Recibe los resutados
  7. ResultSet rs = statement.executeQuery("SELECT * FROM Autores");
  8. while(rs.next())
  9. {
  10. // Crea una nueva instancia del objeto
  11. Autor autor = new Autor(rs.getString("nombre"),rs.getString("apellido"));
  12. autoresTemp.add(autor);
  13. }
  14. Autor autoresTempArreglo[]=new Autor[autoresTemp.size()];
  15. autoresTemp.toArray(autoresTempArreglo);
  16. return autoresTempArreglo;
  17. } catch (SQLException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. return null;
  21. }
  22. }

edito: conseguimos resolver el problema comenzando desde cero, no supe porque daba el error.  En los DAO algunos métodos regresaban null si fallaba algo en la conexion o las sentencias de SQL, imaginé que por ahi estaba el problema.

Saludos