C'è un altro modo in cui puoi usufruire di JVM HotSwapping.
Supponiamo che stiate distribuendo il codice su qualche server. Quindi, quando avvii l'applicazione, assicurati di attivare il debug remoto (che penso si abbia dal momento che si sta eseguendo il debug e si sta parlando di distribuzione). In caso contrario, funzionerà in modo uniforme nel debugger locale.
Ora ho due classi, Principale e Altro.
package com.stackoverflow;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
doStuff();
}
private static void doStuff() throws IOException {
System.out.println("doStuff");
Other.otherStuff();
}
public static void throwException() throws IOException {
throw new IOException();
}
}
package com.stackoverflow;
import java.io.File;
import java.io.IOException;
public class Other {
public static void otherStuff() throws IOException {
File file = new File("Some_File.txt");
file.createNewFile();
}
}
Il throwException()
potrebbe assumere qualsiasi posizione purché sia "globalmente" disponibili, in qualche classe util per esempio. Ora è appena inserito nella mia classe principale per comodità.
Ora possiamo avere un punto di interruzione impostato nel nostro metodo doStuff()
e, mentre si terrà lì siamo in grado di modificare il codice nel metodo otherStuff()
in modo che chiami il nostro metodo statico throwException()
.
public static void otherStuff() throws IOException {
Main.throwException();
File file = new File("Some_File.txt");
file.createNewFile();
}
dobbiamo chiamare un metodo invece di invocare throw new IOException()
perché altrimenti avremo un errore con Unreachable statement
.
Poi possiamo premere Ctrl + Maiusc + F9 ricompilare il altra classe. Ora sarà HotSwapped (una finestra di dialogo chiederà se vuoi davvero farlo).
Quindi premere Continua e verrà generata l'eccezione.
Il codice può quindi essere ripristinato allo stato normale.
La cosa buona è che la classe ricompilata sarà anche scambiata a caldo "via cavo" con la macchina remota.
L'importante è che il codice da ricompilare sia in un'altra classe. La stessa classe in cui si ha il punto di interruzione non verrà ricaricata correttamente.
Come un aggiramento, posso modificare il codice per lanciare l'eccezione e ridistribuire. Ma mi chiedo se c'è un modo per farlo nel debugger senza modificare il codice sorgente.
Si modifica il codice ma solo nel momento in cui si desidera, nel debugger. È quindi possibile ripristinare la piccola modifica e ricompilare a caldo il vecchio codice.
Spero che tu abbia ottenuto l'idea (nessun gioco di parole).
Posso aggiungere schermate se lo si desidera.
E 'improbabile che ci sia un modo per fare quello che stai chiedendo. Suggerirei di esaminare un design diverso che faciliti più facilmente questo tipo di test, ad esempio [dependency injection] (http://en.wikipedia.org/wiki/Dependency_injection). –
@RobI L'iniezione di dipendenza è buona. Non vedo come mi aiuti qui. Puoi elaborare? –
Breve idea: crea un'interfaccia per fare ciò che stai facendo nel blocco di codice che a volte solleva un'eccezione (ad esempio, 'IODoer' con il metodo' do() '). La vostra vera implementazione è in una classe concreta 'IODoerImpl', con tutto il codice reale, ma avete un'altra classe' 'TestIODoer', che solleva un'eccezione ogni volta che chiamate il metodo' do() ', o ogni altra volta, o ogni volta che ... Normalmente il tuo programma usa l'implementazione reale, ma durante i test puoi invece inserire questa classe di test. –