Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

Exception in thread "main" java.lang.NullPointerException

Buen día, antes de modificar el metodo guardar el programa compila, pero despues de hacer lo que sugiere el video me da este error:

Exception in thread "main" java.lang.NullPointerException
    at com.alura.jdbc.controller.ProductoController.listar(ProductoController.java:36)
    at com.alura.jdbc.view.ControlDeStockFrame.cargarTabla(ControlDeStockFrame.java:215)
    at com.alura.jdbc.view.ControlDeStockFrame.configurarTablaDeContenido(ControlDeStockFrame.java:61)
    at com.alura.jdbc.view.ControlDeStockFrame.<init>(ControlDeStockFrame.java:47)
    at com.alura.jdbc.ControlDeStockMain.main(ControlDeStockMain.java:10)

El metodo guardar() quedo asi:

private void guardar() {
        if (textoNombre.getText().isBlank() || textoDescripcion.getText().isBlank()) {
            JOptionPane.showMessageDialog(this, "Los campos Nombre y Descripción son requeridos.");
            return;
        }

        Integer cantidadInt;

        try {
            cantidadInt = Integer.parseInt(textoCantidad.getText());
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, String
                    .format("El campo cantidad debe ser numérico dentro del rango %d y %d.", 0, Integer.MAX_VALUE));
            return;
        }

        // TODO
        var producto = new HashMap<String, String>();
        // Acá llama a u obtiene el texto de un TextField
        producto.put("NOMBRE", textoNombre.getText());
        // Acá llama a u obtiene el texto de un TextField
        producto.put("DESCRIPCION", textoDescripcion.getText());
        // Acá llama a u obtiene el texto de un TextField el valor esta en Integer y lo
        // pasa a String
        producto.put("CANTIDAD", String.valueOf(cantidadInt));
        //Aca se hace uso de una instancia ya creada para usar el metodo guardar y se pasa el producto
        //para llevarlo a la BD y a su respectiva tabla.
        
        //Habia eliminado esta parte 
        var categoria = comboCategoria.getSelectedItem();
        
        try {
            this.productoController.guardar(producto);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        JOptionPane.showMessageDialog(this, "Registrado con éxito!");

        this.limpiarFormulario();
    }

Y en el ProductoController.java los metodos modificados estan asi:

    public List<Map<String, String>> listar() throws SQLException {
        //new ConnectionFactory();
        //Se crea la coneccion a la base de datos con JDBC
        Connection con = ConnectionFactory.recuperaConexion();
        //Se crea un statement con la conneccion a la BD abierta, con el proposito de ejecutar Query's
        Statement statement = con.createStatement();
        //Se ejecuta una query, este metodo devuelve un boolean lo que devulve es confirmacion de 
        //ejecución de la Query
        //boolean result = statement.execute("SELECT ID, NOMBRE, DESCRIPCION, CANTIDAD FROM PRODUCTO");
        //ResultSet es un tipo de objeto que recibe la info que esta en la tabla
        ResultSet resultSet = statement.getResultSet();
        //Para leer fila por fila de la tabla podemos usar lo siguiente:
        List<Map<String, String>> resultado = new ArrayList<>();
        while (resultSet.next()) {
            Map<String,String> fila = new HashMap<>();
            fila.put("ID", String.valueOf(resultSet.getInt("ID")));
            fila.put("NOMBRE", resultSet.getString("NOMBRE"));
            fila.put("DESCRIPCION", resultSet.getString("DESCRIPCION"));
            fila.put("CANTIDAD", String.valueOf(resultSet.getInt("CANTIDAD")));
            
            resultado.add(fila);
        }
        //Cierra la coneccion a la BD
        con.close();
        return resultado;
    }

    public void guardar(Map<String, String> producto) throws SQLException {
        //TODO Kemmer Torres Crear coneccion a la BD
        //TODO Kemmer Torres Crear un Statement para hacer la Query
        Connection con = ConnectionFactory.recuperaConexion();
        Statement statement = con.createStatement();
        String query = String.format("INSERT INTO PRODUTO(NOMBRE, DESCRIPCION, CANTIDAD)"
                + "VALUES ('%s','%s',%d)", producto.get("NOMBRE"),producto.get("DESCRIPCION"),producto.get("CANTIDAD"));
        
        statement.execute(query,Statement.RETURN_GENERATED_KEYS);
        
        ResultSet resulSet = statement.getGeneratedKeys();
        while(resulSet.next()) {
            System.out.println(resulSet.getInt(1));
        }
    }

}

Por que sucede este problema?

1 respuesta
solución!

Ya lo soluciones disculpen las molestias.