JComboBox возвращает исключение нулевого указателя - PullRequest
0 голосов
/ 04 сентября 2018

Я работаю над проектом доставки пакетов на Java.

Я пытаюсь загрузить два JComboBox компонента с данными из базы данных и получаю следующие ошибки.

Sack Trace

    Names : java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.
java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:71)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:73)
    at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1829)
    at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1732)
    at Modelo.UsuarioDAO.usuarios_combo(UsuarioDAO.java:178)
    at Presentacion.ListarEncomiendasAdmin$1.run(ListarEncomiendasAdmin.java:62)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$400(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.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)

Вот мой код для заполнения поля со списком в классе с именем UsuarioDAO.

    public JComboBox usuarios_combo(){
         JComboBox cbox_usuarios = new JComboBox();
         try {

             String sql = "SELECT usu_ci FROM usuarios";
             Connection conn = this.getConexion(); // in here i have a message which prints ok if connection succeeded so i guess the problem won't be here
             PreparedStatement pst1 = conn.prepareStatement(sql);
             pst1.setQueryTimeout(5);
             ResultSet rs = pst1.executeQuery();

             while ((rs != null) && (rs.next())) {

                 String ci = rs.getString("usu_ci");
                 cbox_usuarios.addItem(ci);
             }

             pst1.close();
             rs.close();
             conn.close();

         }
         catch (Exception e) {
             System.err.println("Names : " + e.getClass().getName() + ": " + e.getMessage());
             e.printStackTrace();
         }        
         return cbox_usuarios;
     }

Затем в кадре, куда я хочу загрузить оба поля со списком, у меня есть следующий код:

public class ListarEncomiendasAdmin extends JFrame {

    private JPanel contentPane;
    private JTextField txtEstado;
    private JTextField txtOrigen;
    private JTextField txtDestino;
    private static JTable tblEncomiendas;
    private static EncomiendasDAO eDAO = new EncomiendasDAO();
    private static Object[][] dtEncomienda;
    private static JComboBox cmbRemitente;
    private static JComboBox cmbDestinatario;


    /**
     * Launch the application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            UsuarioDAO uDAO = new UsuarioDAO(); 
            try {
                cmbRemitente = new JComboBox();
                cmbDestinatario = new JComboBox();
                ListarEncomiendasAdmin frame = new ListarEncomiendasAdmin();
                frame.setVisible(true);
                Actualizar_Tabla();
                cmbRemitente = uDAO.usuarios_combo();
                cmbDestinatario = uDAO.usuarios_combo();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

КОД СОЕДИНЕНИЯ

public class ConexionBD {

    /* Datos para la conexion */
    private String bd = "proy_encomiendas";//Base de datos
    private String user = "root"; //Usuario
    private String password = ""; //Contraseña
    private String host = "jdbc:mysql://localhost/"+bd; //Servidor + Base de datos
    public static Connection conn = null; //Inicializamos con valor null la conexion

    /* Constructor de la clase que se conecta a la Base de Datos */
    public ConexionBD(){
        try{
            //Driver para MySQL
            Class.forName("com.mysql.jdbc.Driver");

            //Obtenemos la conexión
            conn = DriverManager.getConnection(host,user,password);
            if (conn!=null){
                System.out.println("Se conecto a la base de datos "+bd+"");
            }
        }catch(SQLException e){
            System.out.println("Error en la ejecución:" + e.getErrorCode() + " " + e.getMessage());
        }catch(ClassNotFoundException e){
            System.out.println(e);
        }
    }

    public Connection getConexion(){
        return ConexionBD.conn;
    }

Я отладил приложение и, как оказалось, оно извлекает данные из базы данных (я вижу итерации с разными числами, которые должны загружаться в поля со списком), но в конце концов, когда отображается кадр, оба поля со списком пусты, и я получаю исключение SQLNonTransient.

Так что любая помощь, которую вы можете предложить, будет принята с благодарностью. Заранее спасибо.

edit: соединение через JDBC. Я использую wampserver, который включает MYSQL.

1 Ответ

0 голосов
/ 05 сентября 2018

измените код класса ConexionBD, как показано ниже: загрузите драйвер в статическом блоке, создавайте новое соединение с БД каждый раз, когда вы вызываете метод getConexion.

static {
    try{
        //Driver para MySQL
        Class.forName("com.mysql.jdbc.Driver");
    } catch(ClassNotFoundException e){
        System.out.println(e);
    }
 }

 public ConexionBD() {
 }

  public Connection getConexion(){
    Connection conn = null;
    try {
         conn = DriverManager.getConnection(host,user,password);
         if (conn!=null){
            System.out.println("Se conecto a la base de datos "+bd+"");
         }
    } catch(SQLException e){
        System.out.println("Error en la ejecución:" + e.getErrorCode() + " " + e.getMessage());
    }
    return conn; 
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...