2010-11-08 11 views
54

Voglio solo creare un oggetto di classe, ma ho ottenuto questo errore durante il debug. Qualcuno può dirmi qual è il problema? La posizione di questo codice si trova in una classe di servizio Spring (2.5).com.sun.jdi.InvocationException si è verificato il metodo di richiamo

C'è un problema simile: OJB Reference Descriptor 1:0 relationship? Should I set auto-retrieve to false?

Grazie mille ~

+3

È difficile indovinare qual è il problema senza codice sorgente o traccia dello stack. –

+8

L'ho capito, il metodo toString() della classe può lanciare NullPointerException se invocato, quando lo correggo, l'errore è scomparso, ma non ho visto come è successo? – xyy

+3

Bel lavoro xyz. Puoi per favore pubblicare una risposta alla domanda tu stesso e quindi accettare quella risposta in modo che possiamo chiudere questa domanda? Inoltre, è necessario accettare le risposte alle domande precedenti se risolvono il problema. – Zecas

risposta

74

La causa principale è che quando il debug l'interfaccia Java di debug chiamerà la toString() della classe per mostrare le informazioni di classe nella pop-up, quindi se il metodo toString non è definito correttamente, ciò può accadere.

+0

grazie, ha funzionato –

27

Ho anche avuto un'eccezione simile durante il debug in Eclipse. Quando ho passato il mouse su un oggetto, la finestra a comparsa mostrava un messaggio com.sun.jdi.InvocationException. La causa principale per me non era il metodo toString() della mia classe, ma piuttosto il metodo hashCode(). Stava causando uno NullPointerException, che causava la comparsa di com.sun.jdi.InvocationException durante il debug. Una volta che ho preso cura del puntatore nullo, tutto ha funzionato come previsto.

2

quindi ho avuto lo stesso problema qui. Ho scoperto che la mia istanza del dominio è stata rimossa dalla sessione di sospensione. Ho usato isAttached() per controllare e attaccare il dominio utilizzando d.attach()

1

La disattivazione del pulsante "Mostra struttura logica"/icona nell'angolo in alto a destra della finestra delle variabili nel debugger di Eclipse l'ha risolto, nel mio caso.

4

Per me la stessa eccezione è stata generata quando il toString è stata definita come tale:

@Override 
public String toString() { 
    return "ListElem [next=" + next + ", data=" + data + "]"; 
} 

Dove ListElem è un elemento di lista collegata e ho creato un ListElem come tale:

private ListElem<Integer> cyclicLinkedList = new ListElem<>(3); 
ListElem<Integer> cyclicObj = new ListElem<>(4); 
... 

cyclicLinkedList.setNext(new ListElem<Integer>(2)).setNext(cyclicObj) 
    .setNext(new ListElem<Integer>(6)).setNext(new ListElem<Integer>(2)).setNext(cyclicObj); 

Questo in modo efficace ha causato un elenco ciclico collegato che non può essere stampato. Grazie per il puntatore.

10

Beh, potrebbe essere a causa di diverse cose come menzionato da altri sopra. Nel mio caso il problema era lo stesso, ma la ragione era qualcos'altro.

In una classe (A), avevo diversi oggetti e uno di oggetti era un'altra classe (B) con altri oggetti. Durante il processo, uno degli oggetti (String) della classe B è diventato nullo, quindi ho tentato di accedere a quell'oggetto tramite la classe parent (A).

Pertanto, la console genererà l'eccezione punto nullo ma il debugger di eclissi mostrerà l'errore sopra menzionato.

Spero che tu possa restare.

+0

questo è stato utile +1 – mattymanme

1

Ci potrebbero essere due ragioni un elemento non esiste:

  1. Bad XPath (// * [@ id'forgotQuote])
  2. XPath corrette, ma nessun elemento (// * [contiene (text(), 'Questo testo non è nella pagina')])

Vuoi ottenere com.sun.jdi.InvocationException in entrambi i casi quando si esegue Debug e si passa il mouse sopra un riferimento al WeBElement (questo con selenio e Java) ???

vengono usate le seguenti, ma non può distinguere se restituisce false a causa di cattiva XPath o elemento inesistente (sintassi XPath valida):

public static boolean isElementDisplayed(WebElement element) { 
    boolean isDisplayed = false; 

    try { 
     isDisplayed = element.isDisplayed(); 
    } catch (NoSuchElementException e) { 
     ;// No Worries 
    } 
    return isDisplayed; 
} 
0

Rimozione hashCode() e equals() risolto il mio problema. Nel mio caso, ho usato il codice hash common-lang di Apache ed è uguale a builder per la creazione manuale di classi non statiche, quindi il compilatore non ha lanciato alcuna eccezione. Ma a runtime ha causato l'eccezione di invocazione.

2

Ho avuto lo stesso problema una volta. Nel mio caso il metodo toString() è stato creato male. Per essere precisi, una variabile finale statica è stata inclusa nel metodo toString quando uno sviluppatore ha assegnato al mio team il compito di eseguire la pulizia del codice e di aggiungere i metodi toString(), hashCode() code e equals() agli oggetti dominio ove possibile. ma nelle classi a causa di un esame eccessivo, ha incluso la variabile statica finale che ha causato "com.sun.jdi.InvocationException" questa eccezione era visibile sul debug solo quando passavo il mouse sopra l'oggetto che ha l'eccezione.

0

Nel mio caso è dovuto al riferimento dell'oggetto che diventa obsoleto. Stavo automatizzando la mia applicazione usando il selenio web, quindi scrivo qualcosa in una casella di testo e poi naviga verso un'altra pagina, quindi mentre ritorna sulla pagina precedente, quell'oggetto diventa obsoleto. Quindi questo stava causando l'eccezione, ho gestito dal nuovo inizializzazione degli elementi - PageFactory.initElements (driver, Test.class;

1

Questo è stato il mio caso

Ho avuto un BO classe di Student che stava avendo molti-a-uno mappatura all'altra BO classe Classi (la classe che ha studiato).

Volevo salvare i dati in un'altra tabella, che aveva chiavi esterne di entrambi Student e Classi. Ad un certo esempio di esecuzione, che stavo portando una lista di studenti in alcune condizioni, e ogni studente avrò un riferimento di Classi classe.

codice di esempio: -

Iterator<Student> itr = studentId.iterator(); 
while (itr.hasNext()) 
{ 
    Student student = (Student) itr.next(); 
    MarksCardSiNoGen bo = new MarksCardSiNoGen(); 

    bo.setStudentId(student); 

    Classes classBo = student.getClasses(); 

    bo.setClassId(classBo); 
} 

Qui si può vedere che, sto impostando entrambi Student e classi riferimento al BO voglio salvare. Ma durante il debugging quando ho ispezionato student.getClasses() stava visualizzando questa eccezione (com.sun.jdi.InvocationException).

Il problema che ho trovato era che, dopo il recupero della lista studenti, utilizzando HQL interrogazione, ero vampate di calore echiusura il sessione di.Quando ho rimosso la dichiarazione session.close();, il problema è stato risolto.

La sessione è stata chiusa quando ho infine salvato tutti i dati nella tabella (MarksCardSiNoGen).

Spero che questo aiuti.

0

Ho ottenuto un'eccezione simile in Eclipse. Ciò era dovuto all'errore java.lang.StackOverflowError. Avevo overriden il metodo toString() in classe figlio, con JoinColumn, che restituiva la stringa utilizzando l'oggetto di parentclass, con conseguente dipendenza circolare. Prova a rimuovere quell'oggetto da toString() e funzionerà.

Problemi correlati