Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315

    eccezione dopo aggiunta a db

    Sto svolgendo un esercizio che richiede la costruzione di una interfaccia grafica usando JavaFX però visto che non riesco a venirne a capo ( http://forum.html.it/forum/showthrea...readid=2921670 ) per via di un errore che non mi fa apparire proprio l'interfaccia creata ho deciso di fare l'esercizio definendo l'interfaccia tramite la libreria Swing (AWT la uso solo per gli eventi e il layout visto che mi sa che è l'unico modo).
    Il programma ha il compito di riempire un database precedentemente creato tramite MySQL con i nomi delle persone, gli indirizzi e i numeri di telefono, ed eventualmente anche di visualizzare i dettagli di una determinata persona specificando solo il nome.
    Io ho creato l'interfaccia e ho gestito gli eventi su di essa ma ho un problema durante l'aggiunta dei nomi.
    Se provo a inserire i dettagli della persona (nome, indirizzo e telefono) attraverso l'interfaccia l'inserimento va a buon fine, e infatti i dati inseriti tramite interfaccia vengono correttamente inseriti nel db, ma mi viene restituita un'eccezzione.
    Questo è ciò che è visualizzato su console:
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "numero"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at com.java8.mod19.test.Rubrica.lambda$0(Rubrica.java:99)
        at com.java8.mod19.test.Rubrica$$Lambda$16/1996181658.actionPerformed(Unknown Source)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(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.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.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)

    e questo è il pezzo di codice incriminato:

    codice:
    buttonAggiungi.addActionListener(event -> {
                                                            String nome = textFieldNome.getText();
                                                            String indirizzo = textFieldIndirizzo.getText();
                                                            String numero = textFieldNumero.getText();
                                                            int numero2 = Integer.parseInt(numero);
                                                            try {
                                                                Aggiungere.aggiungi(nome, indirizzo, numero2);
                                                            }
                                                            catch(SQLException | ClassNotFoundException exc) {
                                                                exc.printStackTrace();
                                                            }
                                                            textFieldNome.setText("nome");
                                                            textFieldIndirizzo.setText("indirizzo");
                                                            textFieldNumero.setText("numero");
                                                      });


    Il problema deriva dal fatto che il campo "telefono" nel db è di tipo int mentre io lo vado ad inserire in un JTextField che accetta stringhe. Il problema l'avevo aggirato trasformando la stringa inserita in un intero (tramite Integer.parseInt()) ma evidentemente questa operazione non viene digerita.

    Cosa ne pensate? E' strano perchè l'operazione comunque va a buon fine.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    No, il problema qui è che alla riga 99 del file Rubrica.java stai cercando di trasformare una stringa in numero, ma la stringa contiene la scritta "numero" (che, ovviamente, non è un valore intero).

    E guardando il codice che hai scritto, sei proprio tu a scrivere nella JTextField il valore "numero":


    codice:
    textFieldNumero.setText("numero");

    A video avrai una casella di testo con dentro scritto "numero", che, evidentemente, non vai a modificare prima di effettuare l'operazione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Si il problema effettivamente l'ho risolto eliminando quelle tre righe che mi permettono di settare i valori nelle JTextField (anche se ora mi vengono create ad ogni inserimento due tuple uguali) ma non capisco una cosa. Perchè mi viene generata un'eccezione se io, dopo l'aggiunta della tupla, vado semplicemente a reimpostare quelle JTextField ai loro valori di default?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Questo non lo so, non è che per sbaglio fai un "doppio-click"? O che, per qualche ragione che io ora non conosco, l'evento viene dispacciato 2 volte?

    Quello che hai scritto:

    (anche se ora mi vengono create ad ogni inserimento due tuple uguali)

    E' esattamente il comportamento descritto sopra: quel codice viene ripetuto 2 volte (per quale ragione io non lo so).

    C'è altro codice? La riga 99, corrisponde a quel Listener?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    La riga 99 corrisponde a questa istruzione:
    codice:
    int numero2 = Integer.parseInt(numero);
    e la cosa più strana è che se lascio tutto come l'ho fatto l'inserimento avviene correttamente ma appunto viene sollevata quell'eccezione, se invece tolgo le istruzioni relative al settaggio delle JTextField (le ultime 3 righe del codice postato prima) l'inserimento va a buon fine ma mi crea due tuple uguali nel db.

    Ora magari ti posto il codice per l'aggiunta ma il problema è chiaro, almeno credo, che non dipende da lì.
    codice:
    public class Aggiungere {
        public static void aggiungi(String nome, String indirizzo, int numero) throws SQLException, ClassNotFoundException {
            try {
                String driver = "com.mysql.jdbc.Driver"; 
                Class.forName(driver);
                String url = "jdbc:mysql://localhost:3306/rubrica";
                Connection con = DriverManager.getConnection(url,"root","password");
                Statement cmd = con.createStatement();
                String qry = "INSERT INTO persone (nome, indirizzo, telefono) VALUES (" + "'" + nome + "'" + "," + "'" + indirizzo + "'" + "," + "'" + numero + "'" + ")";
                cmd.executeUpdate(qry);
                cmd.close();
                con.close();
            }
            finally {
                
            }
        }
    }
    Ultima modifica di newutente; 04-02-2015 a 12:47

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Secondo me quel listener viene aggiunto due volte al pulsante (magari perchè è inserito all'interno di un ciclo, o all'interno di qualche altra parte che viene ripetuta) e, di conseguenza, ti ritrovi con un pulsante con 2 listener identici.

    Il problema non è nel codice di inserimento a DB, ma nel codice che crea quel pulsante e/o nel codice che aggiunge il listener al pulsante.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Mi permetto di postare allora l'intera classe con il main perchè io davvero non riesco a capire qual è il problema:

    codice:
    package com.java8.mod19.test;
    
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.sql.SQLException;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    
    import com.java8.mod19.operazioni.Aggiungere;
    import com.java8.mod19.operazioni.Visualizzare;
    
    public class Rubrica {
        private JFrame frame;
        private JLabel label1;
        private JTextField textFieldNome;
        private JTextField textFieldIndirizzo;
        private JTextField textFieldNumero;
        private JButton buttonAggiungi;
        private JLabel label2;
        private JTextField textFieldCercato;
        private JLabel label3;
        private JLabel label4;
        private JLabel label5;
        private JButton buttonCerca;
        
        public Rubrica() {
            frame = new JFrame("Rubrica");
            label1 = new JLabel("INSERIMENTO DATI");
            textFieldNome = new JTextField("nome");
            textFieldIndirizzo = new JTextField("indirizzo");
            textFieldNumero = new JTextField("numero");
            buttonAggiungi = new JButton("AGGIUNGI");
            label2 = new JLabel("INSERISCI NOME DA CERCARE");
            textFieldCercato = new JTextField();
            label3 = new JLabel();
            label4 = new JLabel();
            label5 = new JLabel();
            buttonCerca = new JButton("CERCA");
            setup();
        }
        
        public void setup() {
            frame.setSize(600, 500);
            frame.setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = 0;
            c.gridy = 0;
            frame.add(label1,c);
            c.gridx = 1;
            c.gridy = 0;
            textFieldNome.setColumns(10);
            frame.add(textFieldNome,c);
            c.gridx = 1;
            c.gridy = 1;
            textFieldIndirizzo.setColumns(10);
            frame.add(textFieldIndirizzo,c);
            c.gridx = 1;
            c.gridy = 2;
            textFieldNumero.setColumns(10);
            frame.add(textFieldNumero,c);
            c.gridx = 1;
            c.gridy = 3;
            frame.add(buttonAggiungi,c);
            c.gridx = 0;
            c.gridy = 4;
            frame.add(label2,c);
            c.gridx = 1;
            c.gridy = 4;
            textFieldCercato.setColumns(10);
            frame.add(textFieldCercato,c);
            c.gridx = 1;
            c.gridy = 5;
            frame.add(label3,c);
            c.gridx = 1;
            c.gridy = 6;
            frame.add(label4,c);
            c.gridx = 1;
            c.gridy = 7;
            frame.add(label5,c);
            c.gridx = 1;
            c.gridy = 8;
            frame.add(buttonCerca,c);
            frame.setVisible(true);
            
            
            buttonAggiungi.addActionListener(event -> {
                                                            String nome = textFieldNome.getText();
                                                            String indirizzo = textFieldIndirizzo.getText();
                                                            String numero = textFieldNumero.getText();
                                                            int numero2 = Integer.parseInt(numero);
                                                            try {
                                                                Aggiungere.aggiungi(nome, indirizzo, numero2);
                                                            }
                                                            catch(SQLException | ClassNotFoundException exc) {
                                                                exc.printStackTrace();
                                                            }
                                                            //textFieldNome.setText("nome");
                                                            //textFieldIndirizzo.setText("indirizzo");
                                                            //textFieldNumero.setText("numero");
                                                      });
            
            
            buttonCerca.addActionListener(event -> {
                                                            String nome = textFieldCercato.getText();
                                                            try {
                                                                Object[] risultato = Visualizzare.visualizza(nome);
                                                                Object nomePersona = risultato[0];
                                                                Object indirizzoPersona = risultato[1];
                                                                Object numeroPersona = risultato[2];
                                                                label3.setText("NOME: " + (String) nomePersona);
                                                                label4.setText("INDIRIZZO: " + (String) indirizzoPersona);
                                                                String numeroTelefono = String.valueOf(numeroPersona);
                                                                label5.setText("TELEFONO: " + numeroTelefono);
                                                            }
                                                            catch(SQLException | ClassNotFoundException exc) {
                                                                exc.printStackTrace();
                                                            }                                                        
                                                   });
            
            
            
            frame.addWindowListener(new WindowListener() {
                                                                public void windowClosing(WindowEvent event) {
                                                                    System.exit(0);
                                                                }
    
                                                                @Override
                                                                public void windowActivated(WindowEvent arg0) {
                                                                    
                                                                }
    
                                                                @Override
                                                                public void windowClosed(WindowEvent arg0) {
                                                                    
                                                                }
    
                                                                @Override
                                                                public void windowDeactivated(WindowEvent arg0) {
                                                                    
                                                                }
    
                                                                @Override
                                                                public void windowDeiconified(WindowEvent arg0) {
                                                                    
                                                                }
    
                                                                @Override
                                                                public void windowIconified(WindowEvent arg0) {
                                                                    
                                                                }
    
                                                                @Override
                                                                public void windowOpened(WindowEvent arg0) {
                                                                    
                                                                }
                                                         });
        
        }
        
        
        public static void main(String args[]) throws SQLException, ClassNotFoundException {
                Rubrica oggetto = new Rubrica();
                oggetto.setup();
            
        }
    }

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ed il problema è proprio lì.
    Tu chiami il metodo setup() sia dentro al costruttore, che nel main subito dopo l'istanziazione: ergo, il listener viene aggiunto 2 volte.
    O richiami il metodo setup() solo nel costruttore o solo nel main.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Accidenti che svista, ovviamente se richiamo due volte setup() svolge due volte le stesse operazioni.
    Grazie per l'aiuto.

    Una domanda ancora, la struttura della classe del main è corretta? Cioè, sto programmando ad oggetti?
    Ultima modifica di newutente; 04-02-2015 a 13:48

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    mi sa che il mio post è finito in basso.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.