Problema com cadastro em SQL

Estou atualmente tentando fazer um sistema de Cadastro de produtos, com opção para alterar e excluir produtos.
O meu problema é que quando eu tento fazer o cadastro do produto no Postgresql ele simplesmente não vai.
Usei o debug para descobrir exatamente onde o erro acontece e o resultado é o encontrado abaixo.


O que pode ser o problema?
Meu script para o banco de dados:
create table Produto(

idproduto serial primary key,
nomeProduto varchar(255) not null,
descproduto varchar(255) not null,
qtdProduto varchar not null,
valorProduto varchar not null
)

ProdutoDao.java
package dao;

import Model.Produto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import jdbc.Conexao;

public class ProdutoDao {

private Connection con;

public ProdutoDao() {
    this.con = new Conexao().getConnection();
}

public boolean add(Produto p) throws SQLException {
    String sql = "insert into produto(nomeproduto, descproduto , qtdproduto, valorproduto) values (?,?,?,?)";

    try {
        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setString(1, p.getNome());
        stmt.setString(2, p.getDesc());
        stmt.setInt(3, p.getQtd());
        stmt.setDouble(4, p.getPreco());
        
        stmt.execute();
        return true;

    } catch (SQLException ex) {
        return false;
    } finally {
        con.close();

    }
}

public boolean update(Produto p) throws SQLException {
    String sql = " update Produto Set nomeproduto =?, descproduto=? , qtdproduto=?, valorproduto=? where idproduto=?";
    try {
        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setString(1, p.getNome());
        stmt.setString(2, p.getDesc());
        stmt.setInt(3, p.getQtd());
        stmt.setDouble(4, p.getPreco());
        stmt.setLong(5, p.getId());

        stmt.execute();
        return true;

    } catch (SQLException ex) {
        return false;
    } finally {
        con.close();
    }
}

public boolean delete(Produto p) throws SQLException {
    String sql = "Delete from Produto where idproduto=?";
    try {
        PreparedStatement stmt = con.prepareStatement(sql);
        stmt.setLong(1, p.getId());
        stmt.execute();
        return true;
    } catch (SQLException ex) {
        Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    } finally {
        con.close();
    }
}

public List<Produto> getList() throws SQLException {
    List<Produto> produtos = new ArrayList<>();
    String sql = "Select * from Produto";
    try {
        PreparedStatement stmt = con.prepareStatement(sql);
       ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            Produto p = new Produto();
            p.setId(rs.getLong("idproduto"));
            p.setNome(rs.getString("nomeproduto"));
            p.setDesc(rs.getString("descproduto"));
            p.setQtd(rs.getInt("qtdproduto"));
            p.setPreco(rs.getDouble("valorproduto"));
            produtos.add(p);
        }
        stmt.execute();
        System.out.println("Lista Retornada com sucesso");
        return produtos;
    } catch (SQLException ex) {
        System.out.println("Erro, lista nao retornada!");
        
        throw new RuntimeException(ex);
    } finally {
        con.close();

    }
}

}

Qualquer outras classes ou controllers que precisarem posso estar disponibilizando.

Cara, olhando por cima já vejo um erro logo de cara.

stmt.setInt(3, p.getQtd());

Você está setando quantidade como int

Em seu script de criação da base

qtdProduto varchar not null,

Você está criando como varchar e não int.

Isso acontece também com

stmt.setDouble(4, p.getPreco());

Veja se é isso.

Peço que poste o erro que é apresentado no console nas próximas vezes.

Experimenta trocar stmt.execute(); por stmt.executeUpdate();