Java - Excepcion java.lang.NullPointerException al intentar guardar datos en un HashMap con interfaces

 
Vista:
sin imagen de perfil
Val: 9
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Excepcion java.lang.NullPointerException al intentar guardar datos en un HashMap con interfaces

Publicado por Ivan (6 intervenciones) el 20/03/2019 11:27:19
Buenos días,

Estoy con un ejercicio de clase que nos pide dar de alta en una interface un libro con sus parametros en una colección hashmap en la cual va guardado en un fichero. Al iniciar el programa debe ejecutar el metodo cargarcolección lo que es leer la colección que está metido en el fichero. Al realizar el alta y dar a aceptar para intentar que se guarde al hashmap la información me da una excepcion de java.lang.NullPointerException: at biblioteca.BibliotecaPrincipal.btnAceptarAltaActionPerformed(BibliotecaPrincipal.java:642) at biblioteca.BibliotecaPrincipal.access$500(BibliotecaPrincipal.java:21) at biblioteca.BibliotecaPrincipal$6.actionPerformed(BibliotecaPrincipal.java:259)

Haber si encontrais el fallo por que me estoy volviendo loco...
Metodo cargar colección:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static HashMap<String, Libros> CargarColeccion(File fichero) {
 
        HashMap <String, Libros> biblio = null;
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        try {
 
            fis = new FileInputStream(fichero);
            ois = new ObjectInputStream(fis);
            biblio = (HashMap<String, Libros>) ois.readObject();
 
        }catch (ClassNotFoundException | FileNotFoundException e) { // Contemplamos excepción si no se encuentran la clase o el fichero.
        } catch (IOException e) { // Contemplamos excepción si hay error en la entrada o salida de datos.
        } catch (Exception e) { // Contemplamos excepción genérica.
        }finally {
            if (ois != null) {
                try {
                    ois.close();
                    fis.close();
                } catch (IOException ex) {
                    System.out.println("Ha ocurrido una IOException");
                }
            }
 
        }
 
        return biblio;
    }

Clase principal con la creacion del hashmap y fichero:

1
2
3
static File fichero = new File("libros.dat");
    //Creamos el HashMap
    HashMap<String, Libros> biblio = Metodos.CargarColeccion(fichero);

Botón aceptar :

//Botón aceptar de dar de alta libro, que cuando se pulsa se añade la información al hashmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
private void btnAceptarAltaActionPerformed(java.awt.event.ActionEvent evt) {
 
        //guardamos los datos
        if (this.textCodigo == null
                || this.textTitulo == null
                || this.textAutor == null
                || this.fechaDia == null
                || this.fechaMes == null
                || this.FechaAno == null
                || (String) this.Lista.getSelectedItem() == "..."
                || (this.radioSi.isSelected() == false && this.radioNo.isSelected() == false)) {
            JOptionPane.showMessageDialog(this.ventanaAlta, "Debe rellenar todos los campos.", "Alta de libro fallida", JOptionPane.ERROR_MESSAGE);
 
        }
        else{
             //tranformación de text a integer
        int fechaDia = Integer.parseInt(this.fechaDia.getText());
        int fechaMes = Integer.parseInt(this.fechaMes.getText());
        int fechaAno = Integer.parseInt(this.FechaAno.getText());
 
 
        String codigo = this.textCodigo.getText();
        String titulo = this.textTitulo.getText();
        String autor = this.textAutor.getText();
        Calendar fecha = new GregorianCalendar(fechaAno, fechaMes, fechaDia);
        String paginas = (String) this.Lista.getSelectedItem();
        boolean libroPremiado = this.radioSi.isSelected();
        Libros libro = new Libros(codigo,titulo, autor, fecha, paginas, libroPremiado);
        System.out.println(fecha);
        System.out.println(libro.toString());
        biblio.put(codigo, libro);
 
        this.textCodigo.setText(null);
        this.textTitulo.setText(null);
        this.textAutor.setText(null);
        this.fechaDia.setText(null);
        this.fechaMes.setText(null);
        this.FechaAno.setText(null);
        this.Lista.setSelectedItem(0);
        this.grupo_premiado.clearSelection();
 
        this.ventanaAlta.setVisible(false);
        this.Principal.setVisible(true);
 
        }
 
 
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Excepcion java.lang.NullPointerException al intentar guardar datos en un HashMap con interfaces

Publicado por Kabuto (1381 intervenciones) el 21/03/2019 00:26:13
Suena como que en realidad el HashMap no se llega a inicializar.

¿El archivo libros.dat ya contiene datos?¿Son de un HashMap anterior creado por tí o te lo han pasado?

Es decir, si libros.dat es un archivo que estás creando tú desde cero para este ejercicio, no podrás inicializar el HashMap con él. La primera vez tendrás que iniciar un HashMap desde el código.
Una vez lo hayas guardado como libros.dat, ya si podrás inicializar el HashMap las siguientes veces que arranques el programa.

No se si es este el problema, mis dudad vienen porque no se el origen de ese archivo libros.dat.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Excepcion java.lang.NullPointerException al intentar guardar datos en un HashMap con interfaces

Publicado por Ivan (6 intervenciones) el 21/03/2019 01:03:12
El libro.dat no contiene datos al iniciar el programa por primera vez. Entonces como hago para iniciar el hashmap en el codigo y luego inicializarlo con cargarColeccion?

No queda muy claro como se haría, ¿Puedes ponerme un ejemplo?

Gracias de antemano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Excepcion java.lang.NullPointerException al intentar guardar datos en un HashMap con interfaces

Publicado por Kabuto (1381 intervenciones) el 22/03/2019 00:11:33
Tu programa ahora mismo lo que hace es "dar por hecho" que el archivo libros.dat existe, y que ya contiene un hashmap serializado listo para ser recuperado y trabajar con él.

Has de modificar esto para que el programa siga una lógica distinta.
Lo importante es que tú no debes crear ningún archivo libros.dat "a mano", es decir, si has creado manualmente un archivo con este nombre, elimínalo para evitar confundir a tu programa.
Este archivo lo ha de crear tu programa, a partir de un HashMap inicializado por tí en el código.

Vamos a ver la lógica a seguir:
Lo primero que hace de hacer tu programa es preguntar si realmente existe o no, el archivo "libros.dat". Así que tendremos dos posibilidades

NO EXISTE:
El archivo no existe, probablemente porque es la PRIMERA vez que ejecutas tu programa. En este caso, el HashMap lo inicializas tú desde el código. Será un HashMap nuevo que comenzará vacío.
Una vez hayas registrado libros, supongo que tu aplicación tendrá un botón o método que se va a encargar de guardar este HashMap en disco para poder recuperarlo en próximas sesiones. Es en este momento cuando tu programa creará el archivo libros.dat.

SÍ EXISTE:
El archivo si existe, esto significa que ya tienes datos guardados de anteriores sesiones. Por lo tanto, ahora sí puedes inicializar tu HashMap desde los datos contenidos en libros.dat, no es necesario crear un HashMap nuevo.


Todo esto lo puedes hacer en la clase principal. No se muy bien como la tienes organizada, pero ya sea en su constructor o tal vez en su método main(), puedes hacer algo así

1
2
3
4
5
6
7
8
static File fichero = new File("libros.dat");
 
    if (fichero.exists()) { //libros.dat SÍ existe
        HashMap<String, Libros> biblio = Metodos.CargarColeccion(fichero); //Recuperamos HashMap desde fichero
    }
    else { //libros.dat NO existe
        HashMap<String, Libros> biblio = new HashMap<String, Libros>(); //Creamos un HashMap nuevo
    }

De este modo, tanto si tienes un archivo libros.dat como si no lo tienes, tendrás un HashMap incializado correctamente con el que poder trabajar.

Repito la importancia de que tú no puedes crear el archivo manualmente, lo ha de crear el propio programa.
Igual que usas la clase ObjectInputStream para leer el archivo libros.dat, en alguna parte de tu código has de usar la clase ObjectOutputStream para crear y actualizar dicho archivo con los libros que vas registrando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Excepcion java.lang.NullPointerException al intentar guardar datos en un HashMap con interfaces

Publicado por Ivan (6 intervenciones) el 22/03/2019 14:45:41
Muchas gracias por la respuesta, me ha servido de mucho y me funciona correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar