Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    20

    Riportare Exception in codice non editabile netbeans

    Ciao a tutti,
    ho deciso di allegare anche un'immagine poichè non sapevo se sarei stato in grado di spiegarmi a parole
    https://mega.co.nz/#!AwplkahY!0eSEUc...NfxfZQtQ8bEbes

    In pratica ho necessità di aggiungere un'eccezione nella parte di codice di NetBeans generato tramite l'editor e quindi non editabile.
    L'errore è: "unreported exception ParseException must be caught or declared to be thrown"
    Cliccando nella lampadina a sinistra mi viene detto come suggerimento di aggiungere una eccezione"Surround Statement with Try-Catch".
    Il problema è che questo non accade poichè (credo) NetBeans non mi fa modificare il codice in quella parte di codice perchè appunto non editabile.

    Il metodo TabellaCaricaGommeValueChanged(e) è:
    codice:
    private void TabellaCaricaGommeValueChanged(javax.swing.event.ListSelectionEvent evt) throws ParseException, SQLException {                                                         int riga_selezionata=TabellaCaricaGomme.getSelectedRow(); // recupero la riga selezionata
                // controllo se ho selezionato una riga
                if (riga_selezionata>=0){
                    // recupero i dati della gomma e li visualizzo
                    PreparedStatement ps_gomma = conn.prepareStatement("select CLIENTE.ID_CLIENTE,NOME,COGNOME,CITTA,ID_GOMMA,DATE_FORMAT(DATA_DEPOSITO,'%d/%m/%Y') as DATA_DEPOSITO,MARCA,MODELLO,MISURA,TIPO,UNITA,TARGA_AUTO,USURA,ANNO_GOMMA from CLIENTE,GOMMA where CLIENTE.ID_CLIENTE=GOMMA.ID_CLIENTE and ID_GOMMA=?");
                    ps_gomma.setString(1,TabellaCaricaGomme.getValueAt(riga_selezionata,0).toString());
                    java.sql.ResultSet rs_gomma = ps_gomma.executeQuery();
                    
                    String ID_Cliente;
                    String nome;
                    String cognome;
                    String tipoGomma;
                    String annoGomma;
                    while (rs_gomma.next()){
                        ID_Cliente=rs_gomma.getString(1);
                        nome=rs_gomma.getString(2);
                        cognome=rs_gomma.getString(3);
                        
                        jTextIDCliente.setText(ID_Cliente);
                        jTextNomeCliente.setText(nome);
                        jTextCognomeCliente.setText(cognome);
                        jComboClienteGomma.setSelectedItem(cognome+" "+nome+" - COD. "+ID_Cliente);
                        jTextCittaCliente.setText(rs_gomma.getString(4));
                                
                        jTextID_Gomma.setText(rs_gomma.getString(5));
           
                       //CREDO SIANO QUESTE 6 RIGHE IL PROBLEMA--------------------------------------
                        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");     //Mi serve per settare il jCalendar al giorno
                        Calendar cal  = Calendar.getInstance();                 //precedentemente selezionato durante
                        cal.setTime(df.parse(rs_gomma.getString(6)));           //l'inserimento della gomma
                        jDateChooser.setCalendar(cal);
                        
                        //jTextData.setText(rs_gomma.getString(6));
                        jTextMarcaGomma.setText(rs_gomma.getString(7));
                        jTextModelloGomma.setText(rs_gomma.getString(8));
                        jTextMisuraGomma.setText(rs_gomma.getString(9));
                        
                        tipoGomma=rs_gomma.getString(10);
                        if(tipoGomma.equals("4 Stagioni")){jRadio4_Stagioni.setSelected(true);}
                        else if(tipoGomma.equals("Estive")){jRadioEstive.setSelected(true);}
                        else if(tipoGomma.equals("Invernali")){jRadioInvernali.setSelected(true);}
                        
                        jQuantitàGomme.setValue(rs_gomma.getInt(11));
                        jTextTarga.setText(rs_gomma.getString(12));
                        jSliderUsura.setValue(rs_gomma.getInt(13));
                        
                        annoGomma=String.valueOf(rs_gomma.getInt(14));
                        if(annoGomma=="0000"){jTextAnnoGomma.setText("");}
                        else{jTextAnnoGomma.setText(annoGomma);}
                    }
                    ps_gomma.close();
                    
                    jButtonCaricaGomma.setEnabled(false);
                    jButtonSalvaModifiche.setEnabled(true);
                    jStampaRapporto.setEnabled(true);
                }
                else {
                    jButtonCaricaGomma.setEnabled(true);
                    jButtonSalvaModifiche.setEnabled(false);
                    jStampaRapporto.setEnabled(false);
                }
            
        }
    Nel codice trovate anche la porzione di codice che credo crei il problema

    Quindi in sostanza la domanda è, sempre che io abbia capito il problema, "Come posso modificare quella porzione di codice e con cosa?"
    Immagini allegate Immagini allegate
    Ultima modifica di Giovas91; 16-11-2014 a 18:05

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Sono tante le cose che puoi migliorare in questo metodo, la prima è SEPARARE LA LOGICA DALLA GRAFICA.
    Lo ripeto fino alla noia, non va bene che in mezzo alla parte che gestisce gli elementi GUI c'è la parte che fa la select al db, questa va fatta a parte!!!

    Hai un oggetto Cliente che mappa la tua tabella del database, dalla GUI chiami il metodo:
    [code]
    private void TabellaCaricaGommeValueChanged(javax.swing.event.ListSelectionEvent evt)throws ParseException,SQLException{

    .....prendi indice desiderato....

    DBWrapper wrapper = new DBWrapper();
    Cliente cl = wrapper.getCliente(idGomma); // o cmq lista parametri
    }[
    /code]

    e usi cl per valorizzare i campi della GUI.

    DBWrapper è una classe (puoi chiamarla come ti pare) che si interfaccia al posto tuo con il db e restituisce un opportuno oggetto.
    Proprio per capire come separare può essere vantaggioso, dovresti avere un progetto a parte che lavora col db e includere la libreria nel tuo classpath, in questo modo ti rendi conto come la grafica deve SOLO occuparsi di rendere a video quello che tu fai.

    Seconda cosa
    codice:
    DateFormat df =newSimpleDateFormat("dd/MM/yyyy");//Mi serve per settare il jCalendar al giorno
                        Calendar cal  =Calendar.getInstance();


    mai mai mai istanziarli dentro un ciclo, anche se sai che il ciclo va eseguito una sola volta.
    Credo che il problema sia nel fatto che il metodo in questione NON possa lanciare quelle eccezioni. Il tuo metodo infatti viene chiamato da un altro metodo:

    codice:
    jTable1.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
                public void propertyChange(java.beans.PropertyChangeEvent evt) {
                    jTable1PropertyChange(evt);
                }
            });
    aggiungere il throws vuole dire gestire qui l'eccezione.
    Il massimo che puoi fare è gestire dentro questo metodo l'eccezione, lanciarla fuori no (per via delle signature e robe varie).

    Puoi scrivere manualmente questo pezzo di codice, ma questo significherebbe dover imporre a propertyChange il throw di una checked exception (cosa non ammessa).

    Soluzione numero 1:
    gestisci l'eccezione dentro il tuo metodo (cosa per me corretta)
    Soluzione numero 2:
    lanci una unchecked exception (soluzione errata per me).
    Soluzione numero 3:
    usare il wrapper per gestire l'eccezione e farti tornare un oggetto client vuoto che indica appunto che qualcosa è andato storto.

    La soluzione 2 non mi piace: non hai l'obbligo di dichiarare di aver generato l'eccezione, non sai cosa succede e quando si genera, eccezione non legata al reale problema, debug insidioso.
    Ultima modifica di valia; 18-11-2014 a 12:20
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    20
    Grazie per la risposta, non ti ho quotato per non allungare troppo il messaggio.

    Iniziamo dall'inizio, premesso che proprio ieri sera ero riuscito a risolvere il problema, credo eseguendo inconsapevolmente il tuo punto 1, ovvero ho usato una try-catch all'interno del metodo.
    Per quanto riguarda la tua premessa sulla separazione del codice con la parte grafica hai ragione, purtroppo ho iniziato a programmare da solo per pura curiosità quindi a tutte queste "piccolezze" non ci ho pensato ma sicuramente la tua soluzione è migliore.

    Invece a riguardo del DBWrapper sinceramente non ho capito molto, tu mi dici di gestire solo la parte grafica nel main, e fino a qui ci sono, poi mi dici di usare questo metodo DBWrapper per fare cosa? Estrarre degli elementi dal db, poi successivamente andare a creare l'oggetto desiderato e solo alla fine utilizzare l'istanza di questo oggetto per compilare la parte grafica? ha capito bene?

    Per il secondo consiglio invece non credo di averci capito nulla perchè non mi consigli di instanziarli dentro un ciclo? per pulizia o per non ottenere l'errore che avevo? In questo caso non va bene come ho risolto? ovvero con una try e catch

    Grazie ancora per la risposta e spero che tu possa togliermi anche questi ultimi dubbi

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    iniziamo con ordine:

    1. contenta che alla fine hai capito che è successo (anche incosapevolmente).
    La separazione del codice (cosa che sembra assurda) va fatta per questioni di comodità, per riusabilità del codice, per manutenibilità.
    Dovesse arrivare un errore, se fai le cose per bene riesci ad isolare l'errore e ad agire. Supponi che l'errore sia sul db, puoi a distanza prendere il jar che contiene la libreria "core" che fa i mestieri sul db e tramite quella debuggare, tanto sai che se hai il corretto risultato, questo arriva a te che magari stampi le cose a video e arriva a chi usa mette a video le info.
    Se tu non lo fai (libero), il debug significa riprodurre a video l'errore (o la sequenza di errori) e cmq aggiungere cose che realmente non riguardano il problema.
    Se riesci a creare una libreria che dato un input ti da un output, a te non interessa come lo fa, sai che dato idGomma in output hai il cliente.
    2. DBWrapper (o una serie di classi wrapper) sono delle classi che usi per interfacciarti con il database da contesti in cui tu non devi sapere come prendi le info.
    Ad esempio, supponi di avere tutta una serie di metodi che caricano le classi, scrivono i dati ecc.
    Tu in ogni tua classe dovresti
    a. creare la connessione
    b. scrivere la query
    c. parsare il result

    se tu crei una classe che fa questo per te (in modo trasparente) sicuramente ne hai dei vantaggi.
    Pensa che il tuo metodo che fa quanto detto sopra (con gestione errori) termina con 2 istruzioni, una istanzi il wrapper, una chiedi quello che ti interessa.

    Vantaggio: sicuramente concentri in un unico punto dove accedi al db (aumento manutenibilità).
    Sleghi il reperimento delle info da dove le info sono contenute. Se sono su file, su db, su rete a te non importa, tu sai che al posto tuo il wrapper le reperisce per te. In questo modo ti concentri sul reale problema (buttarle a video) perché altrove le hanno elaborate/prodotte. anche in questo caso aumenti la manutenibilità e hai possibilità di espansione quasi infinite (devi produrre un wrapper).

    Contro: hai l'impressione di complicare le cose, anche se in realtà se capisci bene la logica le vai a semplificare.

    3. non istanziare robe come formatter o calender in cicli rientra "nell'uso oculato delle risorse". Il formatter e spesso anche calendar di ciclo in ciclo cambiano pochissimo (se non sono sempre uguali). Ogni new comporta un nuovo riferimento in memoria (e nel caso del formatter altro per poterlo ottenere). Se tanto te ne serve uno, lo fai fuori, non perdi tempo a crearli e non sprechi memoria a tenerne il riferimento (anche se la variabile perde visibilità a fine ciclo, il gc(quindi cancellazione vera e propria) può non intervenire subito).

    Va bene, come hai risolto, ti ripeto io preferisco la 3 per come modellizzo il problema (uso il wrapper per separare codice in modo che GUI non sappia niente del resto).
    RTFM Read That F*** Manual!!!

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.