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

    Serializzazione Integer e NullPointerException

    Salve ho una classe cliente, vorrei capire come mai , quando vado a inviare una sua istanza su un socket tramite un ObjectOutputStream, il server che riceve tale istanza , quando va a leggere il campo integer id_cliente, si verifica una NullPointerException.
    codice:
    package jCallRemember.libreria;
    
    
    import java.io.Serializable;
    import java.sql.Date;
    import java.sql.Time;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.regex.Pattern;
    
    
    /**
     *
     * Questa classe implementa un oggetto che
     * rappresenta un cliente. E definisce le caratteristiche di alcuni suoi campi
     * mediante l'utilizzo di espressioni regolari.
     */
    public final class ClienteDB implements Serializable {
    
    
        private String statoAppuntamento;
        private Integer id_cliente;
        private String nome;
        private String cognome;
        private String telefono;
        private String mail;
        private java.util.Date primo_contatto;
        private java.sql.Date dataAppuntamento;
        private java.sql.Time oraAppuntamento;
        transient private static final String regexNome = "\\D{0,20}";
        transient private static final String regexCognome = "[a-zA-Z]{0,20}";
        transient private static final String regexMail = "(([a-zA-Z0-9._%-]{1,64})@([a-zA-Z0-9.-]{2,186})"
                + "\\.([a-zA-Z]{2,4}))?";
        transient private static final String regexTelefono = "([0-9]{5,12}){1}";
    
    
        public ClienteDB() {
        }
    
    
        /**
         * Costruttore con parametri
         *
         * @param nome
         * @param cognome
         * @param mail
         * @param tel
         */
        public ClienteDB(String nome, String cognome, String mail, String tel) {
            this.setNome(nome);
            this.setCognome(cognome);
            this.setMail(mail);
            this.setTelefono(telefono);
        }
    
    
        /**
         *
         * @return il valore del campo nome
         */
        public String getNome() {
            return nome;
        }
    
    
        /**
         * Imposta il campo nome dell'oggetto cliente
         *
         * @param nome
         */
        public void setNome(String nome) throws IllegalArgumentException {
            boolean error = !Pattern.matches(regexNome, nome);
            if (error) {
                throw new IllegalArgumentException("Formato del campo Nome"
                        + " non valido");
            }
            this.nome = nome;
        }
    
    
        public String getCognome() {
            return cognome;
        }
    
    
        /**
         * Imposta il valore del campo cognome dell'oggetto cliente
         *
         * @param cognome
         */
        public void setCognome(String cognome) throws IllegalArgumentException {
            boolean error = !Pattern.matches(regexCognome, cognome);
            if (error) {
                throw new IllegalArgumentException("Formato del campo Cognome"
                        + " non valido");
            }
            this.cognome = cognome;
        }
        /**
         * 
         * @return il numero di telefono del cliente
         */
        public String getTelefono() {
            return telefono;
        }
    
    
        /**
         * Imposta il valore del campo telefono, dell'oggetto cliente
         *
         * @param telefono
         */
        public void setTelefono(String telefono) throws IllegalArgumentException {
            boolean error = !Pattern.matches(regexTelefono, telefono);
            if (error) {
                throw new IllegalArgumentException("Formato del campo Telefono"
                        + " non valido");
            }
            this.telefono = telefono;
        }
    
    
        public String getMail() {
            return mail;
        }
    
    
        /**
         * Imposta il valore del campo mail dell'oggetto cliente
         *
         * @param mail
         */
        public void setMail(String mail) throws IllegalArgumentException {
            boolean error = !Pattern.matches(regexMail, mail);
            if (error) {
                throw new IllegalArgumentException("Formato del campo Mail"
                        + " non valido");
            }
            this.mail = mail;
        }
    
    
        /**
         *
         * @return la data dell'appuntamento del cliente
         */
        public Date getDataAppuntamento() {
            return dataAppuntamento;
        }
    
    
        /**
         * Imposta la data dell'Appuntamento del cliente, prendendo in input una
         * data dal formato dd/MMM/yyyy
         *
         * @param dataAppuntamento
         * @throws java.text.ParseException
         */
        public void setDataAppuntamento(String dataAppuntamento)
                throws NullPointerException,
                ParseException {
            if (dataAppuntamento == null) {
                throw new NullPointerException("Impostare Campo Data Appuntamento+"
                        + "\nValore Nullo non valido!");
            }
            SimpleDateFormat dataformat = new SimpleDateFormat("dd/MMM/yyyy");
            java.util.Date data = dataformat.parse(dataAppuntamento);
            this.dataAppuntamento = new java.sql.Date(data.getTime());
        }
    
    
        public void setDataAppuntamento(java.sql.Date data) throws
                NullPointerException {
            if (data != null) {
                this.dataAppuntamento = data;
            } else {
                throw new NullPointerException();
            }
        }
    
    
        /**
         *
         * @return l'ora dell'appuntamento del cliente
         */
        public Time getOraAppuntamento() {
            return oraAppuntamento;
        }
    
    
        /**
         * Imposta l'ora dell'appuntamento
         *
         * @param oraAppuntamento
         * @throws java.text.ParseException
         *
         */
        public void setOraAppuntamento(String oraAppuntamento)
                throws NullPointerException, ParseException {
            if (oraAppuntamento == null) {
                throw new NullPointerException("Impostare ora appuntamento,valore"
                        + " Nullo non valido!");
            }
            oraAppuntamento=oraAppuntamento.concat(":00");
            SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
            java.util.Date ora = sdf.parse(oraAppuntamento);
            this.oraAppuntamento = new java.sql.Time(ora.getTime());
            
        }
    
    
        public void setPrimo_contatto(java.util.Date primo_contatto) {
            this.primo_contatto = primo_contatto;
        }
    
    
        public void setOraAppuntamento(Time oraAppuntamento) {
            this.oraAppuntamento = oraAppuntamento;
        }
    
    
        public java.util.Date getPrimo_contatto() {
            return primo_contatto;
        }
        
        
        public Integer getId_cliente() {
            return id_cliente;
        }
    
    
        public void setId_cliente(Integer id_cliente) {
            this.id_cliente = id_cliente;
        }
        
        
        /**
         * Ritorna lo stato dell'appuntamento
         * @return 
         */
        public String getStatoAppuntamento() {
            return statoAppuntamento;
        }
        /**
         * 
         * @param statoAppuntamento 
         */
        public void setStatoAppuntamento(String statoAppuntamento) throws IllegalArgumentException {
            if(!statoAppuntamento.equals("PR") && !statoAppuntamento.equals("OK") &&
                    !statoAppuntamento.equals("KO")){
                throw new IllegalArgumentException("Stato Appuntamento non valido");
            }
            this.statoAppuntamento = statoAppuntamento;
        }
        
        @Override
        public String toString(){
            return//this.getId_cliente().toString()+"\n"+
                    this.getNome()+"\n"+
                    this.getCognome()+"\n"+
                    this.getMail()+"\n"+
                    this.getTelefono()+"\n"+
                    this.getPrimo_contatto().toString()+"\n"+
                    this.getDataAppuntamento().toString()+"\n"+
                    this.getOraAppuntamento().toString()+"\n"+
                    this.getStatoAppuntamento()+"\n";
            
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    quando vado a inviare una sua istanza su un socket tramite un ObjectOutputStream, il server che riceve tale istanza , quando va a leggere il campo integer id_cliente, si verifica una NullPointerException.
    Non ho letto tutto il codice in dettaglio ma la classe mi sembra ok, in particolare quel campo 'id_cliente' è un normale campo "di istanza" (e Integer è serializzabile) e con i getter/setter tecnicamente corretti (sebbene c'è il "_" in mezzo nel nome che non è il massimo ....).
    Quindi a prima vista non vedrei errori "palesi".


    P.S. i campi "di classe" (static) non serve marcarli transient. La serializzazione esclude già tassativamente i campi static.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    io prima di inviare l'oggetto sul socket controllo anche che sia tutto corretto, ovvero che il campo sia settato , ma quando arrivo dall'altro lato e chiamo il metodo get si verifica una nullpointerexception

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    io prima di inviare l'oggetto sul socket controllo anche che sia tutto corretto, ovvero che il campo sia settato , ma quando arrivo dall'altro lato e chiamo il metodo get si verifica una nullpointerexception
    È strano .... ma senza vedere esattamente il codice (ambo i lati) che usa ClienteDB, è difficile dire cosa non va allora. Potrebbe essere qualche altra banalità.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Allora praticamente il campo statoAppuntamento anche essendo impostato arriva null, mentre adesso l'id_cliente arriva uguale a 0!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Allora praticamente il campo statoAppuntamento anche essendo impostato arriva null, mentre adesso l'id_cliente arriva uguale a 0!
    Consiglio: definisci il toString() in modo appropriato e con un formato che sia realmente "utile". Salvo casi particolari (es. oggetti usati dai renderer Swing) la stringa dal toString() non serve che sia "espressiva" per l'utente ... basta che faccia vedere "tecnicamente" i valori e basta (i toString() di Date, Time, ecc... sono già sensati).
    Come formato, prendi generalmente spunto dai toString() nel framework, ad esempio da quello di java.awt.Rectangle che è:

    codice:
        public String toString() {
            return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]";
        }

    Non fare cose tipo:

    getPrimo_contatto().toString()

    perché se primo_contatto è null, lì si schianta con NullPointerException.

    Quindi stampa il risultato da un lato e dell'altro e guarda cosa c'è eventualmente di sbagliato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Qui è dove invio l'oggetto ne stampo anche lo stato , ed è tutto coerente...
    codice:
    System.out.println("OGGetto inviato al client setAppuntamentoOK()" );
            System.out.println(c.toString());
            oos.writeObject(c);
            oos.flush();
    Qui invece e dove lo ricevo :

    codice:
    ClienteDB c = (ClienteDB) ois.readObject();
                    System.out.println(op);
                    System.out.println(c);
    il campo idCliente risulta 0 (se modifico a int invece che Integer, null altrimenti e si verifica la nullpointerexception) , mentre l'altro ovvero statoAppuntamento risulta null, ma non capisco il perchè.
    Ultima modifica di linux_r; 20-05-2014 a 10:14

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Allora questo è il metodo che invia l'oggetto cliente al server ,lo stampo e lo trovo in uno stato coerente..
    codice:
       /**
         * Comunica al server di cambiare lo stato dell'appuntamento
         * @param c
         * @return
         * @throws IOException 
         */
        public boolean setAppuntamentoOK(ClienteDB c) throws IOException{
            oos.writeObject(Operazioni.APPUNTAMENTO_OK);
            oos.flush();
            System.out.println("OGGetto inviato al client setAppuntamentoOK()" );
            System.out.println(c.toString());
            oos.writeObject(c);
            oos.flush();
            return ois.readBoolean();
                    
        }

    Questo invece è quello che fa il server :
    codice:
    // aspetto di leggere un oggetto Operazioni(enum)
            Operazioni op = (Operazioni) ois.readObject();
            this.setWorking(true);//indica che è arrivata una richiesta di lavoro
    
    
            switch (op) {
                case INSERIMENTO:
                    cliente = (ClienteDB) ois.readObject();
    
    
                    Integer id = Database.getInstance().insertCliente(cliente, login.getUsername());
    
    
                    oos.writeInt(id);
                    oos.flush();
    
    
                    break;
    
    
                case DOWNLOAD:
                    Object[][] appuntamenti = Database.getInstance().downloadAppuntamentiOperatore(this.login);
    
    
                    oos.writeObject(appuntamenti);
                    oos.flush();
    
    
                    break;
    
    
                case AGGIORNA_APPUNTAMENTO:
                    cliente = (ClienteDB) ois.readObject();
                    String id_cliente=String.valueOf(cliente.getId_cliente());
                    boolean query1 = Database.getInstance().updateField(7, 1, id_cliente,
                            cliente.getDataAppuntamento().toString(), GestoreDatabase.Tabella.CLIENTE);
                    boolean query2 = Database.getInstance().updateField(8, 1, id_cliente,
                            cliente.getOraAppuntamento().toString(), GestoreDatabase.Tabella.CLIENTE);
    
    
                    oos.writeBoolean(query1 & query2);
    
    
                    break;
                case APPUNTAMENTO_OK:
                    ClienteDB c = (ClienteDB) ois.readObject();
                    System.out.println(op);
                    System.out.println(c);
                    boolean esito = Database.getInstance().updateField(
                            10, 
                            1,
                            String.valueOf(c.getId_cliente()),
                            c.getStatoAppuntamento(),
                            GestoreDatabase.Tabella.CLIENTE);
                    oos.writeBoolean(esito);
                    oos.flush();
                    break;
    
    
            }
    Arriva al caso APPUNTAMENTO_OK e li praticamente la variabile d'istanza Stato_Appuntamento risulta null, nonostante nel client risulti impostate e l'idcliente risulta 0 se lo utilizzo come int, null se lo dichiaro come integer nella classe ClienteDB..
    Sto impazzendo

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Ho notato un' altra cosa , praticamente se scrivo i singoli campi sul socket in questo modo il server li legge , se scrivo l'intero oggetto cliente no:
    codice:
     public boolean setAppuntamentoOK(ClienteDB c) throws IOException{
            oos.writeObject(Operazioni.APPUNTAMENTO_OK);
            oos.flush();
            oos.writeObject(c);
            oos.flush();
            oos.writeInt(c.getId_cliente());
            oos.flush();
            oos.writeObject(c.getStatoAppuntamento());
            oos.flush();
            
            return ois.readBoolean();
                    
        }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Purtroppo non so che dirti .... la sfera di cristallo non ce l'ho ... dovrei essere lì da te per vedere e capire cosa succede.
    Una domanda mi viene in mente: quel 'ClienteDB' è la stessa identica classe da entrambe le parti?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.