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

    ERRORE non static method XXX cannot be referenced from a static context

    Ciao a tutti.

    Sto scrivendo una servlet utilizzando delle API messe a disposizione da un programma per la gestione delle telefonate VoIP. Premetto, come ho fatto già qualche giorno fa in un altro 3d, che sono assolutamente un novizio del mondo Java (provengo infatti dal mondo C e inoltre utilizzo php se devo sviluppare delle applicazioni web) e quindi chiedo scusa fin d'ora se il problema che vi pongo è assolutamente banale per voi. Dunque, questo è il codice incriminato nel metodo doPost:

    codice:
     CiscoCall call = (CiscoCall) provider.createCall();  // creo un oggetto chiamata
     final CiscoCallID id = call.getCallID();                 // ottengo l'id identificativo della chiamata
     
      /* Altro codice qui */
    
     while (repeat > 0  &&  connected == false)
     {
    
        Thread.sleep(200);
        repeat--;                
        terminal.addObserver(new TerminalObserver() {
           public void terminalChangedEvent(TermEv[] evlist){
               for(int i=0; i<evlist.length; i++) {
                   if(evlist instanceof CiscoTermEv) {           
                      if (evlist.getID() == CiscoRTPInputStartedEv.ID &&
                          id == CiscoRTPInputStartedEv.getCallID() )  /* genera l'errore */
                      {
                         inputev = true;                                                              
                      }
                       else if (evlist.getID() == CiscoRTPOutputStartedEv.ID && 
                                 id == CiscoRTPOutputStartedEv.getCallID()) /* genera l'errore */
                       {
                          outputev = true;
                       }
                     }
               }
           }});
        if ( inputev  == true && outputev == true )
        {
           connected = true;  
        } 
    }
    L'istruzione

    CiscoRTPInputStartedEv.getCallID()
    serve a recuperare l'id della chiamata associata all'evento CiscoRTPInputStartedEv. Analogo discorso si può fare per l'istruzione CiscoRTPOutputStartedEv.getCallID(). Purtroppo, in fase di compilazione ottengo due errori

    non static method getCallID() cannot be referenced from a static context
    in corrispondenza delle istruzioni sopra citate. Ho provato a cercare sulla rete un metodo per risolvere il problema (ad esempio ho trovato questa discussione), ma non sono riuscito ad applicarla alla mia situazione. Potreste darmi una mano per cortesia?

    Ve ne sarei molto grato!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,323
    Quei due metodi non sono statici, quindi non li puoi richiamare in quel modo (NomeClasse.nomeMetodo). Devi prima creare un'istanza dell'oggetto CiscoRTPInputStartedEv (o ottenerne una in qualche modo) e richiamare il metodo sulla specifica istanza.


    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
    Originariamente inviato da LeleFT
    Quei due metodi non sono statici, quindi non li puoi richiamare in quel modo (NomeClasse.nomeMetodo). Devi prima creare un'istanza dell'oggetto CiscoRTPInputStartedEv (o ottenerne una in qualche modo) e richiamare il metodo sulla specifica istanza.


    Ciao.
    Ciao!

    Anzitutto grazie per avermi risposto così in fretta. Se non sbaglio, ciò che mi consigli di fare è qualcosa di simile a questo:

    codice:
    CiscoRTPInputStartedEv crise = new CiscoRTPInputStartedEv();
    
    /* altro codice e quindi*/
    
    crise.getCallID();
    Il problema è che in fase di compilazione mi da il seguente errore:

    com.cisco.jtapi.extensions.CiscoRTPInputStartedEV is abstract; cannot be instantiated
    A questo punto cosa dovrei fare? :master:

    Depressione.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    24
    Originariamente inviato da classiFICO
    Ciao!

    Anzitutto grazie per avermi risposto così in fretta. Se non sbaglio, ciò che mi consigli di fare è qualcosa di simile a questo:

    codice:
    CiscoRTPInputStartedEv crise = new CiscoRTPInputStartedEv();
    
    /* altro codice e quindi*/
    
    crise.getCallID();
    Il problema è che in fase di compilazione mi da il seguente errore:



    A questo punto cosa dovrei fare? :master:

    Depressione.
    La cosa più veloce che puoi provare a fare è dichirare il metodo getCallId() statico( a meno che quest ultimo metodo non manipoli variabili d'istanza)

  5. #5
    Originariamente inviato da cuccagna
    La cosa più veloce che puoi provare a fare è dichirare il metodo getCallId() statico( a meno che quest ultimo metodo non manipoli variabili d'istanza)
    Ciao! Grazie anche a te per avermi risposto.

    In teoria, dovendo chiamare il metodo getCallID() solo nella condizione del ramo if,

    codice:
    if (evlist.getID() == CiscoRTPInputStartedEv.ID && id == CiscoRTPInputStartedEv.getCallID())
    credo che la tua soluzione potrebbe andare bene. Tuttavia, ho letto da alcune parti che questa operazione sarebbe meglio non farla e inoltre dovrei andare a smanettare direttamente nel file jtapi.rar (in particolare "decompilare" un file .class e poi ricompilarlo) e la cosa non mi sembra molto ortodossa. Che tu sappia, ci sono altri modi per ottenere un'istanza dell'oggetto CiscoRTPInputStartedEv (o anche un oggetto XXX) oltre a quella, fallita, di usare il seguente modo?

    codice:
    CiscoRTPInputStartedEv crise = new CiscoRTPInputStartedEv();
    Grazie fin d'ora se qualcuno avrà la pazienza di rispondermi.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    24
    Originariamente inviato da classiFICO
    Ciao!

    Anzitutto grazie per avermi risposto così in fretta. Se non sbaglio, ciò che mi consigli di fare è qualcosa di simile a questo:

    codice:
    CiscoRTPInputStartedEv crise = new CiscoRTPInputStartedEv();
    
    /* altro codice e quindi*/
    
    crise.getCallID();
    Il problema è che in fase di compilazione mi da il seguente errore:



    A questo punto cosa dovrei fare? :master:

    Depressione.
    Quindi non hai il sorgente ma il file .class , dunque la mia precedente soluzione è tortuosa.
    Seguendo il consiglio di Lele.... crei un oggeto di CiscoRTPInputStartedEv.
    Purtroppo vedendo l'errore che ti da si capisce che CiscoRTPInputStartedEv è una classe astratta e non è possibile creare istanze(oggetti) di una classe astratta.
    Potresti modificare la classe CiscoRTPInputStartedEv rendendola concreta ma a quanto ho capito non hai il file .java ma solo il bytecode cioè il .class

    Come possiamo risolvere il problema?
    Una classe astratta può avere dei metodo concreti.
    Ci sono due casi:
    1) Se il metodo getCallID() è astratto in CiscoRTPInputStartedEv allora ci deve senz altro essere una sottoclasse che implementa il metodo getCallID().
    In questo caso puoi fare Sottoclasse oggetto = new Sottoclasse();
    e poi oggetto.getCallID() o anche:
    CiscoRTPInputStartedEv oggetto = new Sottoclasse();
    oggetto.getCallID()

    2) se getCallID() è concreto(implementato) in CiscoRTPInputStartedEv la cosa è più problematica e ci sono due sottocasi:
    2.1)Il metodo è implementato(sovrascritto) anche in una sottoclasse e per come è implementato nella sottoclasse va bene per i tuoi scopi.
    In questo caso devi fare lo stesso che hai fatto al punto 1
    2.2)getCallID() è implementato solo in CiscoRTPInputStartedEv.
    In questo caso devi creare tu una nuova classe che estende CiscoRTPInputStartedEv(e devi implementare tutti i metodo astratti di CiscoRTPInputStartedEv).
    Nel sovrascrivere getCallID() devi usare la stessa firma che c'è nella superclasse CiscoRTPInputStartedEv e per richiamare le funzionalità di getCallId di CiscoRTPInputStartedEv devi usare super();

    potresti scrivere:

    public tipoDiRitorno getCallID()
    {
    return super();
    }

    Poi crei un oggetto così:
    CiscoRTPInputStartedEv oggetto = new sottoclasseDaTeCreata();
    oggetto.getCallId();


    Spero di essere stato chiaro

  7. #7
    Originariamente inviato da cuccagna
    Quindi non hai il sorgente ma il file .class , dunque la mia precedente soluzione è tortuosa.
    Seguendo il consiglio di Lele.... crei un oggeto di CiscoRTPInputStartedEv.
    Purtroppo vedendo l'errore che ti da si capisce che CiscoRTPInputStartedEv è una classe astratta e non è possibile creare istanze(oggetti) di una classe astratta.
    Potresti modificare la classe CiscoRTPInputStartedEv rendendola concreta ma a quanto ho capito non hai il file .java ma solo il bytecode cioè il .class

    Come possiamo risolvere il problema?
    Una classe astratta può avere dei metodo concreti.
    Ci sono due casi:
    1) Se il metodo getCallID() è astratto in CiscoRTPInputStartedEv allora ci deve senz altro essere una sottoclasse che implementa il metodo getCallID().
    In questo caso puoi fare Sottoclasse oggetto = new Sottoclasse();
    e poi oggetto.getCallID() o anche:
    CiscoRTPInputStartedEv oggetto = new Sottoclasse();
    oggetto.getCallID()

    2) se getCallID() è concreto(implementato) in CiscoRTPInputStartedEv la cosa è più problematica e ci sono due sottocasi:
    2.1)Il metodo è implementato(sovrascritto) anche in una sottoclasse e per come è implementato nella sottoclasse va bene per i tuoi scopi.
    In questo caso devi fare lo stesso che hai fatto al punto 1
    2.2)getCallID() è implementato solo in CiscoRTPInputStartedEv.
    In questo caso devi creare tu una nuova classe che estende CiscoRTPInputStartedEv(e devi implementare tutti i metodo astratti di CiscoRTPInputStartedEv).
    Nel sovrascrivere getCallID() devi usare la stessa firma che c'è nella superclasse CiscoRTPInputStartedEv e per richiamare le funzionalità di getCallId di CiscoRTPInputStartedEv devi usare super();

    potresti scrivere:

    public tipoDiRitorno getCallID()
    {
    return super();
    }

    Poi crei un oggetto così:
    CiscoRTPInputStartedEv oggetto = new sottoclasseDaTeCreata();
    oggetto.getCallId();


    Spero di essere stato chiaro
    Ciao!

    Anzitutto grazie per la velocità e per il tempo che ti ho fatto perdere (manca la faccina che si inchina devotamente, ma fa come se ci fosse). Dunque, ho provato a decompilare il file CiscoRTPInputStartedEv.class e questo è il risultato:

    codice:
    package com.cisco.jtapi.extensions;
    
    public abstract interface CiscoRTPInputStartedEv extends CiscoTermEv
    {
      public static final int ID = 1073758209;
    
      public abstract CiscoRTPInputProperties getRTPInputProperties();
    
      public abstract CiscoCallID getCallID();
    
      public abstract CiscoRTPHandle getCiscoRTPHandle();
    
      public abstract int getMediaConnectionMode();
    }
    Come avevi già ampiamente intuito, CiscoRTPInputStartedEv è una classe astratta. Essendo anche il metodo getCallID() astratto, si deduce che la soluzione che devo seguire è la prima che mi hai indicato, ovvero cercare una sottoclasse. Ho provato a scartabellare un pochettino in giro per il file jtapi.jar (ho pure provato ad allegarlo a questo post aggiungendo all'estensione un .gif per motivi di "estensioni valide", ma superando le dimensioni massime in termine di dimensione ho ricevuto solo un errore), ma l'unica cosa abbastanza interessante che ho trovato è questa:

    file CiscoRTPInputStartedEvImpl.class
    codice:
    package com.cisco.jtapi;
    
    import com.cisco.jtapi.extensions.CiscoCallID;
    import com.cisco.jtapi.extensions.CiscoRTPHandle;
    import com.cisco.jtapi.extensions.CiscoRTPInputProperties;
    import com.cisco.jtapi.extensions.CiscoRTPInputStartedEv;
    
    final class CiscoRTPInputStartedEvImpl extends TermEvImpl
      implements CiscoRTPInputStartedEv
    {
      RTPInputProperties CTQF;
      CiscoCallID I;
      RTPHandleImpl Z;
      int C;
    
      CiscoRTPInputStartedEvImpl(TerminalImpl paramTerminalImpl, RTPInputProperties paramRTPInputProperties, CiscoCallID paramCiscoCallID, RTPHandleImpl paramRTPHandleImpl, int paramInt)
      {
        super("CiscoRTPInputStartedEv", paramTerminalImpl, 100);
        this.CTQF = paramRTPInputProperties;
        this.I = paramCiscoCallID;
        this.Z = paramRTPHandleImpl;
        this.C = paramInt;
      }
    
      public final int getID()
      {
        return 1073758209;
      }
    
      public final CiscoRTPInputProperties getRTPInputProperties()
      {
        return this.CTQF;
      }
    
      public final CiscoCallID getCallID()
      {
        return this.I;
      }
    
      public final CiscoRTPHandle getCiscoRTPHandle()
      {
        return this.Z;
      }
    
      public final int getMediaConnectionMode()
      {
        return this.C;
      }
    }
    che però non credo fosse quello che si cercava; infatti ho provato a scrivere all'interno del mio codice:

    codice:
    CiscoRTPInputStartedEv crise = new CiscoRTPInputStartedEvImpl();
    ma ne ho solo ricavato l'ennesimo errore:

    com.cisco.jtapi.CiscoRTPInputStartedEvImpl is not public in com.cisco.jtapi; cannot be accessed from outside package
    Ovviamente ho provato a navigare a ritroso fra i files CiscoTermEv.class, CiscoCallID.class... ma non ho trovato nulla di interessante.
    Vorrei sapere se devo cercare fra i files .class quello in cui c'è una dichiarazione del tipo:

    public blablabla extends CiscoRTPInputStartedEv

    E' possibile che non ce ne sia nemmeno uno?

    Mah...sempre più sta situazione!

    Ancora grazie per tutto e ciao!

  8. #8
    Ho uploadato il file delle jtapi (rinominandolo file.jar), così se qualcuno avesse la curiosità di vedere quanta roba c'è basta un semplice click.

    http://www.megaupload.com/?d=23Z3GWZF

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    24
    Originariamente inviato da classiFICO
    Ciao!

    Anzitutto grazie per la velocità e per il tempo che ti ho fatto perdere (manca la faccina che si inchina devotamente, ma fa come se ci fosse). Dunque, ho provato a decompilare il file CiscoRTPInputStartedEv.class e questo è il risultato:

    codice:
    package com.cisco.jtapi.extensions;
    
    public abstract interface CiscoRTPInputStartedEv extends CiscoTermEv
    {
      public static final int ID = 1073758209;
    
      public abstract CiscoRTPInputProperties getRTPInputProperties();
    
      public abstract CiscoCallID getCallID();
    
      public abstract CiscoRTPHandle getCiscoRTPHandle();
    
      public abstract int getMediaConnectionMode();
    }
    Come avevi già ampiamente intuito, CiscoRTPInputStartedEv è una classe astratta. Essendo anche il metodo getCallID() astratto, si deduce che la soluzione che devo seguire è la prima che mi hai indicato, ovvero cercare una sottoclasse. Ho provato a scartabellare un pochettino in giro per il file jtapi.jar (ho pure provato ad allegarlo a questo post aggiungendo all'estensione un .gif per motivi di "estensioni valide", ma superando le dimensioni massime in termine di dimensione ho ricevuto solo un errore), ma l'unica cosa abbastanza interessante che ho trovato è questa:

    file CiscoRTPInputStartedEvImpl.class
    codice:
    package com.cisco.jtapi;
    
    import com.cisco.jtapi.extensions.CiscoCallID;
    import com.cisco.jtapi.extensions.CiscoRTPHandle;
    import com.cisco.jtapi.extensions.CiscoRTPInputProperties;
    import com.cisco.jtapi.extensions.CiscoRTPInputStartedEv;
    
    final class CiscoRTPInputStartedEvImpl extends TermEvImpl
      implements CiscoRTPInputStartedEv
    {
      RTPInputProperties CTQF;
      CiscoCallID I;
      RTPHandleImpl Z;
      int C;
    
      CiscoRTPInputStartedEvImpl(TerminalImpl paramTerminalImpl, RTPInputProperties paramRTPInputProperties, CiscoCallID paramCiscoCallID, RTPHandleImpl paramRTPHandleImpl, int paramInt)
      {
        super("CiscoRTPInputStartedEv", paramTerminalImpl, 100);
        this.CTQF = paramRTPInputProperties;
        this.I = paramCiscoCallID;
        this.Z = paramRTPHandleImpl;
        this.C = paramInt;
      }
    
      public final int getID()
      {
        return 1073758209;
      }
    
      public final CiscoRTPInputProperties getRTPInputProperties()
      {
        return this.CTQF;
      }
    
      public final CiscoCallID getCallID()
      {
        return this.I;
      }
    
      public final CiscoRTPHandle getCiscoRTPHandle()
      {
        return this.Z;
      }
    
      public final int getMediaConnectionMode()
      {
        return this.C;
      }
    }
    che però non credo fosse quello che si cercava; infatti ho provato a scrivere all'interno del mio codice:

    codice:
    CiscoRTPInputStartedEv crise = new CiscoRTPInputStartedEvImpl();
    ma ne ho solo ricavato l'ennesimo errore:



    Ovviamente ho provato a navigare a ritroso fra i files CiscoTermEv.class, CiscoCallID.class... ma non ho trovato nulla di interessante.
    Vorrei sapere se devo cercare fra i files .class quello in cui c'è una dichiarazione del tipo:

    public blablabla extends CiscoRTPInputStartedEv

    E' possibile che non ce ne sia nemmeno uno?

    Mah...sempre più sta situazione!

    Ancora grazie per tutto e ciao!
    Oibò. Ti ringrazio dei ringraziamenti.
    Ora se non erro(non sono sicuro però) il problema dovrebbe essere che il metodo getCallID() accede ad un campo(I) che è ad accesso al package cioè solo classi che sono nello stesso package possono accedere ad esso.
    Infatti la parola final in una classe indica che tutti i metodi sono implicitamente final e la classe non può essere estesa ma dovrebbe essere possibile crearne oggetti e richiamarne metodi.

    Puoi provare a fare il seguente tentativo:
    1) O rendi pubblici le variabili d'istanza della classe in questione( in particolare I)
    2)Oppure crei la tua classe e la infili e compili nel package com.cisco.jtapi (quindi non userai import)

    Prova e fai sapere.
    Ciao

  10. #10
    Originariamente inviato da cuccagna
    Oibò. Ti ringrazio dei ringraziamenti.
    Ora se non erro(non sono sicuro però) il problema dovrebbe essere che il metodo getCallID() accede ad un campo(I) che è ad accesso al package cioè solo classi che sono nello stesso package possono accedere ad esso.
    Infatti la parola final in una classe indica che tutti i metodi sono implicitamente final e la classe non può essere estesa ma dovrebbe essere possibile crearne oggetti e richiamarne metodi.

    Puoi provare a fare il seguente tentativo:
    1) O rendi pubblici le variabili d'istanza della classe in questione( in particolare I)
    2)Oppure crei la tua classe e la infili e compili nel package com.cisco.jtapi (quindi non userai import)

    Prova e fai sapere.
    Ciao
    Ciao.

    Anzitutto scusa per il ritardo con cui ti rispondo, anche se fino a ieri pomeriggio non sapevo come avrei dovuto agire.

    Abbiamo analizzato la situazione: il problema è che noi stiamo lavorando con un programma ( Cisco CUCM ) che mediamente ogni anno (clicca qui ), rilascia una nuova versione e un aggiornamento della versione precedente e conseguentemente delle nuove versioni delle jtapi. L'applicazione web che vogliamo fare vorrebbe essere il più indipendente possibile da questa cosa, ovvero, in pratica, a seconda delle versione di CUCM che troviamo, prendiamo il relativo file jtapi.jar, lo mettiamo nella cartella lib e l'applicazione web funziona. Se dovessimo fare come ci hai consigliato tu, ogni volta dovremmo creare un file jtapi ad hoc e questo ci porterebbe via troppo tempo; il problema si pone, inoltre, solo se noi vogliamo far partire una conferenza quando l'utente principale è già impegnato in un'altra conversazione telefonica, evento assai raro. Per questo abbiamo deciso di non seguire il tuo consiglio (tuttavia appena avrò, se avrò, un momento di tempo libero proverò la modifica che hai consigliato) e ci limiteremo ad avvertire l'utente che non può far partire una conferenza se è già impegnato in un'altra conversazione telefonica. Che scansafatiche!

    Comunque grazie infinite sia a te, sia a LeleFT per il tempo che vi abbiamo portato via!

    Siete veramente dei grandi!

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.