Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    NullPointerException misterioso

    Sto impazzendo da ore per capire da dove derivi questo errore a runtime che oggi non avevo, pur essendo abbastanza convinta di non aver modificato niente che riguardi quella parte.
    Stack:

    codice:
    2018-02-03 22:41:18.668:WARN:/:qtp1280713652-42: Exception while dispatching incoming RPC call
    com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.Double com.google.asteonlineing.client.AoLService.getOffertaMax(com.google.asteonlineing.shared.Asta)' threw an unexpected exception: java.lang.NullPointerException
        at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:416)
        at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:605)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)
        at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.Server.handle(Server.java:499)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
        at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
        at java.lang.Thread.run(Unknown Source)
    Caused by: 
    java.lang.NullPointerException
        at com.google.asteonlineing.server.AoLServiceImpl.getOffertaMax(AoLServiceImpl.java:720)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:587)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)
        at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.Server.handle(Server.java:499)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
        at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
        at java.lang.Thread.run(Unknown Source)
    Il metodo getOffertaMax() mi dà quell'errore solo DOPO che ho inserito almeno un'offerta.
    La riga incriminata è questa:

    codice:
    maxVal = (maxVal > offerte.get(listaId.get(i)).getOfferta()) ? maxVal : offerte.get(listaId.get(i)).getOfferta();
    Il metodo completo è questo:
    codice:
        public Double getOffertaMax(Asta astaCorrente) {
    
            if (astaCorrente == null) return null;
            synchronized (lock) {
    
                Integer id = astaCorrente.getId();
                DB db = DBMaker.newFileDB(new File(FILE_NAME)).closeOnJvmShutdown().make();
                ConcurrentNavigableMap<Integer, Asta> aste = db.getTreeMap("aste");
                ConcurrentNavigableMap<Integer, Offerta> offerte = db.getTreeMap("offerte");
                //prendo come valore di riferimento il prezzo base
                Double maxVal = aste.get(id).getPrezzoBase();
                //creo un arraylist per tutti gli id delle offerte riferite ad astaCorrente
                ArrayList<Integer> listaId = astaCorrente.getOfferte();
                for (int i = 0; i < listaId.size(); i++) {
                    maxVal = (maxVal > offerte.get(listaId.get(i)).getOfferta()) ? maxVal : offerte.get(listaId.get(i)).getOfferta();
                }
                db.close();
                return maxVal;
            }
        }
    Non riesco a capire perché quel metodo mi dà errore non appena inserisco un'offerta!! Se non c'è nessuna offerta mi restituisce correttamente il valore (in questo caso pari al prezzoBase).
    Sto impazzendo (
    Grazie a chiunque potrà aiutarmi.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Il problema si trovava in un'altra parte del codice, cioè nel metodo di inserimento dell'offerta, ovvero:

    codice:
        public Integer inserisciOfferta (String offerente, Double importo, Asta astaRif) {
                DB db = DBMaker.newFileDB(new File(FILE_NAME)).closeOnJvmShutdown().make();
                ConcurrentNavigableMap<Integer, Offerta> offerte = db.getTreeMap("offerte");
                //Creo id atomico per l'offerta da inserire, non replicabile
                Atomic.Integer idOfferta = db.getAtomicInteger("idOfferta");
                //creo la data di inserimento
                Date today=new Date();
                //controllo che l'offerta sia superiore alla massima attuale
                if (importo <= getOffertaMax(astaRif) ) {
                    db.close();
                    return 0; //se non lo e' ritorno 0
                }
                else {
                    Offerta nuovaOfferta = new Offerta (idOfferta.incrementAndGet(), offerente, importo, astaRif.getId(), today);
                    offerte.put(nuovaOfferta.getIdOfferta(), nuovaOfferta);
                    db.commit(); //se messo dopo l'associazione seguente, nullpointer su getOffertaMax
                    db.close(); //se messo dopo l'associazione seguente, nullpointer su getOffertaMax
                    //associo l'offerta appena inserita all'utente e all'asta di riferimento
                    associaOffertaUtente(nuovaOfferta.getIdOfferta(), offerente);
                    this.associaOffertaAsta(nuovaOfferta.getIdOfferta(), astaRif.getId());
                }
                return 1;
        }
    Avevo messo il db.commit() e db.close() dopo aver chiamato il metodo associaOffertaUtente e associaOffertaAsta. Ora, qui cominciano le stranezze. Prima funzionava, poi non funziona più. Adesso se tento di inserire un'offerta ottengo questo errore:

    codice:
    2018-02-04 12:52:39.139:WARN:/:qtp1143751326-38: Exception while dispatching incoming RPC call
    com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.Integer com.google.asteonlineing.client.AoLService.inserisciOfferta(java.lang.String,java.lang.Double,com.google.asteonlineing.shared.Asta)' threw an unexpected exception: java.lang.RuntimeException: Writer thread failed
        at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:416)
        at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:605)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)
        at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.Server.handle(Server.java:499)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
        at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
        at java.lang.Thread.run(Unknown Source)
    Caused by: 
    java.lang.RuntimeException: Writer thread failed
        at org.mapdb.AsyncWriteEngine.checkState(AsyncWriteEngine.java:290)
        at org.mapdb.AsyncWriteEngine.commit(AsyncWriteEngine.java:490)
        at org.mapdb.EngineWrapper.commit(EngineWrapper.java:95)
        at org.mapdb.DB.commit(DB.java:1266)
        at com.google.asteonlineing.server.AoLServiceImpl.inserisciOfferta(AoLServiceImpl.java:665)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:587)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)
        at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
        at org.eclipse.jetty.server.Server.handle(Server.java:499)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
        at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
        at java.lang.Thread.run(Unknown Source)
    Caused by: 
    java.lang.ArrayIndexOutOfBoundsException: -1811939328
        at org.mapdb.Volume$ByteBufferVol.tryAvailable(Volume.java:273)
        at org.mapdb.Volume.ensureAvailable(Volume.java:58)
        at org.mapdb.StoreWAL.replayLogFile(StoreWAL.java:621)
        at org.mapdb.StoreWAL.commit(StoreWAL.java:579)
        at org.mapdb.EngineWrapper.commit(EngineWrapper.java:95)
        at org.mapdb.AsyncWriteEngine.access$201(AsyncWriteEngine.java:72)
        at org.mapdb.AsyncWriteEngine.runWriter(AsyncWriteEngine.java:230)
        at org.mapdb.AsyncWriteEngine$WriterRunnable.run(AsyncWriteEngine.java:156)
        at java.lang.Thread.run(Unknown Source)
    Sinceramente non so più che pesci pigliare!

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Niente, alla fine ho dovuto "aggirare" il problema, togliendo il richiamo al metodo getOffertaMax() nel metodo che inserisce l'offerta, questo ovviamente mi ha costretto a replicare un po' di codice perché devo comunque controllare che l'importo inserito sia superiore a quello dell'ultima offerta presente.
    Non sono riuscita a capire cos'è che gli desse fastidio nel richiamare quel metodo in quel punto del codice. Tra parentesi, questo è il metodo in questione:

    codice:
        public Double getOffertaMax(Asta astaCorrente) {
            if (astaCorrente == null) return null;
            synchronized (lock) {
                Integer id = astaCorrente.getId();
                DB db = DBMaker.newFileDB(new File(FILE_NAME)).closeOnJvmShutdown().make();
                ConcurrentNavigableMap<Integer, Asta> aste = db.getTreeMap("aste");
                ConcurrentNavigableMap<Integer, Offerta> offerte = db.getTreeMap("offerte");
                //prendo come valore di riferimento il prezzo base
                Double offertaMax = aste.get(id).getPrezzoBase();
                //creo un arraylist per tutti gli id delle offerte riferite ad astaCorrente
                ArrayList<Integer> listaId = astaCorrente.getOfferte();
                for (int i = 0; i < listaId.size(); i++) {
                    offertaMax = (offertaMax > offerte.get(listaId.get(i)).getOfferta()) ? offertaMax : offerte.get(listaId.get(i)).getOfferta();
                }
                db.close();
                return offertaMax;
            }
        }

  4. #4
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Anzi, in realtà ho appena capito dov'è il problema: è in quel

    db.close();
    se lo metto all'interno del ciclo for non ottengo più quell'errore in fase di inserimento di un'offerta, però lo ottengo quando quel metodo viene richiamato nella pagina che mostra il valore massimo di un'offerta, anzi ottengo un errore diverso, che mi dice (giustamente) che il db è stato già chiuso e quindi c'è stato un "illegal access".
    In pratica penso che per aggirarlo dovrei fare in modo che il db.close() viene eseguito all'interno del ciclo for solo DOPO che è stato trovato il valore max. Come faccio a dirgli: fai questo solo se hai trovato il valore massimo? Lui come fa a sapere qual'è il massimo se non ha finito di scorrere l'array?

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Non so se può interessare a qualcuno ma ho scoperto che quel tipo di errore, "java.lang.RuntimeException: Writer thread failed", relativamente a MapDB è legato a qualche bug delle vecchie versioni, risolvibile (così dicono) aggiornando alle ultime versioni. Io non l'ho fatto perché l'ultima versione ha un sacco di dipendenze e metodi deprecati e questo mi avrebbe costretto a modificare parecchio il codice, ho risolto con un workaround. La cosa interessante è che lo stesso codice, sulla macchina della mia collega, che è un Mac di ultima generazione, non produceva lo stesso errore ma veniva eseguito senza problemi. La mia macchina è invece un win7 64 bit. Comunque, ho consegnato il progetto, e questo strazio per ora è finito :-)
    Un grazie particolare ad Andbin per i suoi suggerimenti e la sua cortesia.
    Un tempo trovare aiuto nei forum e nei newsgroup (per chi se li ricorda...) era cosa quasi scontata, oggi non è più così per cui quando accade la cosa è particolarmente apprezzata, almeno da me :-)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.