2013-06-05 19 views
6

Ho un po 'di codice in una classe in esecuzione in Java 1.7.0_17 e Jboss 4.2.3GA in Windows. Il codice fa questo:impossibile comportamento chiamata metodo Java

Date newNextDate = inBetween(currentDate, nextDate, start); 
print("newNextDate=" + newNextDate); 

il trascorre fa un confronto abbastanza semplice:

private Date inBetween(Date start, Date end, Date test) { 
    ... 
    Date contains = t.contains(test) ? test : end; 
    print("returning contains=" + contains); 
    return contains; 
} 

l'attuazione esatta contiene non è pertinente IMHO, perché nei risultati finali in un java.util.Date essere stato assegnato alla variabile contiene. L'uscita su stdout è:

16:44:56,153 INFO returning contains=Tue Apr 30 23:59:59 CEST 2013 
16:44:56,153 INFO newNextDate=null 

E questo dove dove il mistero ha inizio: 1. appena prima l'istruzione return la contiene variabile ha un valore 2. dopo il ritorno della variabile raccolta è nullo

Come è possibile nel mondo?

  • Sì, abbiamo controllato se è stato chiamato esattamente questo metodo intermedio, altrimenti non avrebbe stampato l'output.
  • No, non esiste alcuna variabile di istanza con lo stesso nome. Ma anche se, non c'è niente in mezzo.
  • No, non è possibile eseguire il debug del processo, perché si verifica solo sui nostri server di produzione e non è riproducibile in fase di sviluppo.

La cosa più strana è che si verifica solo qui, da nessun'altra parte nelle 1.000.000 righe di codice.

+0

Nel codice in cui si trova la "stampa", stampare una traccia dello stack. 'Eccezione e = nuova NullPointerException(); System.printstacktrace (e); '(warning: pseudo-java) e assicurati che non ci sia stata un'iniezione di un proxy di qualche tipo attorno al metodo' inBetween() '. (Oscuro ma possibile). –

+0

si può effettivamente collegare a jvm e eseguire il debug remoto del server di produzione. http://java.dzone.com/articles/how-debug-remote-java-applicat –

+0

Utilizzare il debug e iterare passo dopo passo. Aggiungi punti di interruzione dove necessario e osserva i valori. Hai sicuramente un errore da qualche parte. – Quillion

risposta

2

Forse hanno sovraccaricato il tuo inbetween e che viene chiamato:

private Date inBetween(long start, Date end, Date test) { 
    Date result = null; 
    inBetween(new Date(start), end, test); 
    return result; 
} 

O qualcosa di simile tipico. A catch ... return null.

L'unico altro modo tecnico sarebbe avere un intercettore AOP che esegue una cache errata (memoization?) O così. Improbabile.

+0

Il metodo è privato e all'interno della stessa classe, quindi non può essere sovraccaricato. Ma abbiamo controllato e ce n'è solo uno.Nel debug è possibile rintracciare la chiamata a questo metodo (ma poi funziona correttamente). – tbeernot

+0

Codice impossibile, quando in realtà nessun blocco finale, nessun'altra stampa ("che ritorna contiene =" + ...); return null; 'nel' ... '. _ (** override ** = via ereditari ha un metodo con lo stesso nome e tipi di parametri; ** overload ** = ha un metodo con lo stesso nome ma diversi tipi di parametri) _ –

Problemi correlati