Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Java]classe implementata che non gestisce le eccezioni di quella nuova. Come fare?

    Salve, ho questo problema. Ho una classe che ne implementa un'altra che gestisce solo XMLRPCException.
    Ora io nella mia ho un metodo che deve necessariamente gestire anche una Exception, ma Eclipse mi segnala un errore.

    codice:
    public class StatisticHandler  implements XmlRpcHandler
    
    ....
    ....
    public Object execute(XmlRpcRequest request) throws XmlRpcException, Exception{
    ...
    ...
    Questo è l'errore:
    Exception Exception is not compatible with throws clause in XmlRpcHandler.execute
    (XmlRpcRequest)

    Secondo voi cossa posso fare??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java]classe implementata che non gestisce le eccezioni di quella nuova. Come far

    Originariamente inviato da mainframe
    Questo è l'errore:
    Exception Exception is not compatible with throws clause in XmlRpcHandler.execute
    (XmlRpcRequest)
    Una delle regole fondamentali dell'override dice che il metodo che fa l'override non può dichiarare eccezioni "checked" che siano in più (quindi aggiunte) o più ampie (meno specifiche) rispetto al metodo di cui si vuole fare l'override. Ne può dichiarare di meno o di più ristrette ma in sostanza non può "ampliare".

    E implementando i metodi di una interfaccia si devono seguire lo stesso queste regole dell'override.

    execute() di XmlRpcHandler dichiara solo XmlRpcException, quindi non puoi dichiarare altre eccezioni checked che non siano quella o sottoclassi di quella.

    Cosa volevi fare? Segnalare che è sbucata fuori una eccezione checked??

    Come molte altre eccezioni, XmlRpcException supporta quello che si chiama "exception chaining", ci sono dei costruttori di XmlRpcException che ricevono un Throwable.
    Bene, ti salta fuori una eccezione checked? Passala al costruttore di XmlRpcException e lancia quest'ultima.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    codice:
    public Object execute(XmlRpcRequest request) throws XmlRpcException{
                 if (request.getMethodName()=="newData") {
                            String name=(String) request.getParameter(0);
                            return newData(name);
                    } else {
                            throw new XmlRpcException("No such method!");
                    }
                 if (request.getMethodName()=="add_name") {
                            String name=request.getParameter(0).toString();
                            Integer valore=(Integer)request.getParameter(1);
                            return add_name(name,valore);
                    } else {
                            throw new XmlRpcException("No such method!");
                    } 
                          if (request.getMethodName()=="average_name") {
                            return average_name();
                    } else {
                            throw new XmlRpcException("No such method!");
                    }  
    ....
    ....
    Questo e' il codice, come vedi le xmlrpcexception gestiscono solo il caso il nome del metodo non sia specificato, devo quindi gestire i casi in cui i parametri passati non siano giusti. (Credo??).
    Non ho pero' capito bene come fare quello che dici tu, io ho anche messo un try catch nel client al momento in cui chiama la execute, pero' non basta.
    Potresti farmi vedere dove inserire il codice che mi hai suggerito?.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mainframe
    Questo e' il codice, come vedi le xmlrpcexception gestiscono solo il caso il nome del metodo non sia specificato, devo quindi gestire i casi in cui i parametri passati non siano giusti. (Credo??).
    Premetto che non so nulla di XML RPC, di quella interfaccia XmlRpcHandler, di cosa devi fare ecc.... Ti parlo però conoscendo bene in generale le regole.

    Innanzitutto fai un confronto con le stringhe usando ==. Non va bene, devi usare equals(). Andrebbe bene solo se, e ripeto se, tu sapessi che getMethodName() ritorna esattamente un reference uguale identico ad una di quelle stringhe literal. Cosa che dubito, pur non conoscendo esattamente come funziona XML RPC.

    Poi avrebbe senso testare prima le varie stringhe e poi solo alla fine, se non è nessuna di quelle, allora lanci una eccezione. Vedo che hai messo 3 else e 3 throw ... non so a cosa possa servire ....

    Inoltre per la questione della eccezione, è diverso da quello che avevo ipotizzato io. Non hai a che fare con una eccezione checked che ti può sbucare per via di qualche metodo invocato ma se tui che stai lanciando una "tua" eccezione per segnalare semplicemente che il nome non è tra quelli possibili.
    Quindi tecnicamente va bene creare un XmlRpcException specificando solamente un messaggio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quindi tecnicamente va bene creare un XmlRpcException specificando solamente un messaggio.
    Infatti non capisco che differenza possa fare il tipo di eccezione che ritorna, anzi credo non c'entri nulla, pero' aggiungendo Exception mi sparisce l'errore, senno rimane.

    Comunque sono riuscito a circoscrivere il codice errato a due righe:
    codice:
    String name=request.getParameter(0).toString();
              Integer valore=(Integer)request.getParameter(1);
    Il fatto è che getParameter ritorna i parametri dei vari metodi di tipo Object.
    Negli altri metodi dove i parametri sono string (anche piu di uno) va tutto bene, questo è l'unico dove c'e' string e integer e mi crea problemi..
    Sono arrivato alla conclusione che sia questo, potrebbe essere?

  6. #6
    Anzi è qui:
    Integer valore=(Integer)request.getParameter(1);
    che non va.
    Il cast da Object a Integer credo non sia corretto, non c'e' un metodo tipo toString?

    poi non dovrebbe essere
    codice:
    Integer valore=new Integer((Integer)request.getParameter(1));
    ??

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mainframe
    Infatti non capisco che differenza possa fare il tipo di eccezione che ritorna, anzi credo non c'entri nulla, pero' aggiungendo Exception mi sparisce l'errore, senno rimane.
    Non capisco il tuo dubbio: nella dichiarazione del tuo metodo, non puoi dichiarare che lancia Exception. Questo mi sembra chiaro. Se, come ho visto dal tuo pezzetto di codice, lanci solo XmlRpcException, che ti serve Exception? O c'è altro che non so/ho visto del tuo codice?

    Originariamente inviato da mainframe
    Comunque sono riuscito a circoscrivere il codice errato a due righe:
    codice:
    String name=request.getParameter(0).toString();
              Integer valore=(Integer)request.getParameter(1);
    Il fatto è che getParameter ritorna i parametri dei vari metodi di tipo Object.
    Negli altri metodi dove i parametri sono string (anche piu di uno) va tutto bene, questo è l'unico dove c'e' string e integer e mi crea problemi..
    Sono arrivato alla conclusione che sia questo, potrebbe essere?
    Tecnicamente le due righe sono corrette. Anche il cast a Integer tecnicamente è lecito. Ma a runtime l'oggetto fornito dal parametro 1 è davvero un Integer?? Se lo è, ok. Se non lo è ... beh, ti becchi ClassCastException.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Infatti anche a me sembrano corrette e credo l'errore sia da un'altra parte, anche il tipo di ritorno Object poi mi rimane scomodo. Posto tutto il metodo:
    codice:
    public Object execute(XmlRpcRequest request) throws XmlRpcException{
    	 
    	     if (request.getMethodName().equals("newData" )  ||
    			 request.getMethodName().equals("add_name" )  ||
    			 request.getMethodName().equals("average_name" )  ||
    			 request.getMethodName().equals("min_name" )  ||
    			 request.getMethodName().equals("max_name" )  ||
    			 request.getMethodName().equals("merge" )  ||
    			 request.getMethodName().equals("reset" )  )
    	      {
                    if (request.getMethodName().equals("newData")) {
                            String name=request.getParameter(0).toString();
                            return newData(name);
                    } 
                    if (request.getMethodName().equals("add_name")) {
                          String name=request.getParameter(0).toString();    
             //            Integer valore=new Integer(((Integer) request.getParameter(1)));
                           return add_name(name,valore);
                    } 
                    if (request.getMethodName().equals("average_name")){
                            return average_name();
                    } 
                    if (request.getMethodName().equals("min_name")) {
                            return min_name();
                    } 
                    if (request.getMethodName().equals("max_name")) {
                            return max_name();
                    } 
                    if (request.getMethodName().equals("merge")) {
                            String x=request.getParameter(0).toString();
                            String y=request.getParameter(1).toString();
                            String z=request.getParameter(2).toString();
                            merge(x,y,z);
                    } 
                    if (request.getMethodName().equals("reset")) {
                            return reset();
                    } 
    	      }    
                    else {
                           throw new XmlRpcException("Il metodo non esiste!");
                          return null;
                    }
              
         }
    e il client invoca i metodi con
    codice:
    ....
    Object []params = new Object []{new String("test analisi"),new Integer(20)};
    		try
            {
    			Object result = client.execute("newData", params );
    			System.out.println("The result is: "+result+".");
            }
            catch(Exception ex)
            {
                System.err.println("Error: " + ex.getMessage());
            }
    Quello che dicevi te sul valore che poteva non essere un Integer a runtime mi torna ,ma siccome lo passo io e sono sicuro che è integer dovrebbe andare bene.
    Il metodo newdata ritorna un boolean è quindi ci vuole anche un cast nel client, ma quello va bene lo faccio dopo, piu che altro mi interessa capire perche quel metodo execute non va..

  9. #9
    Ma tu richiami il metodo execute passandogli una stringa e un array di object...

    Il metodo execute che hai postato invece richiede un XmlRpcRequest

    :master:
    Al mio segnale... scatenate l'inferno!

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.