2012-10-18 12 views
5

Ho un metodo come questo:come riavviare un metodo dal suo ultimo punto di errore

public void runMethod() 
    { 
    method1(); 
    method2(); 
    method3(); 
    } 

voglio chiamare questo runMethod più volte in base a un id. Tuttavia, se say metodo2() fallisce per qualche motivo, quando chiamo runMethod, dovrebbe eseguire method3() e non provare a eseguire nuovamente method1() (che è già stato eseguito correttamente per questo id).

Quale sarebbe il modo migliore per raggiungere questo obiettivo?

Grazie mille per l'aiuto

risposta

3

Si potrebbe registrare in una mappa se un metodo ha eseguito con successo o meno.

private Map<String, Boolean> executes = new HashMap<String, Boolean>(); 

public void method1() { 
    Boolean hasExecuted = executes.get("method1"); 
    if (hasExecuted != null && hasExecuted) { 
     return; 
    } 
    executes.put("method1", true); 
    ... 
} 

// and so forth, with method2, method3, etc 
+0

Non proprio, però, si vuole ignorare quello fallito anche se ho letto correttamente alla domanda. –

+0

@jschoen Buon punto, ho erroneamente soprannominato le variabili per implicare che i successi dovrebbero essere saltati, non fallire. Tuttavia, il codice funziona ancora allo stesso modo; solo i campi devono essere rinominati. EDIT: E ora è risolto. – Vulcan

+0

Non sono sicuro che lo farebbe. Fondamentalmente è necessario monitorare solo se è stato chiamato, non se ha fallito o avuto successo. Quindi dovrebbe somigliare più alla risposta di Htaras. –

1

Sei alla ricerca di una sorta di macchina a stati. Mantenere lo stato dell'esecuzione del metodo in una struttura dati (mappa E.g).

All'inizio del metodo, è necessario verificare se l'esecuzione di method1 per l'ID specificato è stata eseguita correttamente o meno.

public void runMethod() 
{ 
    method1(); 
    method2() 
    method3(); 
} 
private Set<Integer> method1Executed = new HashSet<Integer>(); 
private Set<Integer> method2Executed = new HashSet<Integer>(); 

private void method1(Integer id) 
{ 
    if (method1Executed.contains(id)) { 
     return; 
    } 
    // Processing. 
    method1Executed.add(id) 
} 

// Similar code for method2. 
+0

L'unica cosa che cambierei è il commento di elaborazione (che presumo sia dove dovrebbe andare il resto del codice dei metodi) dopo il 'method1Executed.add (id)'. Cioè se sto capendo correttamente la domanda, riguardo il voler saltare 'method1()' e 'method2()' alla seconda chiamata quando 'method2()' fallisce. –

+0

Grazie per la risposta. Ma il mio scenario è tale che il metodo 1 può essere chiamato di nuovo su tutta la linea. E ho "n" numero di metodi, ogni metodo sta fondamentalmente facendo una piccola operazione. Quindi, se consideri ciascun metodo come un passo, allora potrei avere ancora bisogno di richiamare lo stesso metodo, ma nessun passaggio dovrebbe essere ripetuto, anche se fallisce.L'ID – Sai

+0

deve essere aggiunto solo alla fine, perché se viene generata qualche eccezione nella logica "Elaborazione", non viene considerata valida e l'ID non deve essere aggiunto al set "method1Executed". – Htaras

1

La mia soluzione sarebbe di aggiungere un int è un indicatore, invece di introdurre mappe, in particolare se il codice viene chiamato spesso. Sarebbe simile a questa:

public int runMethod(int flag) { 
    if (flag < 1) { 
     method1(); 
     if (method1failed) { 
      return 1; 
     } 
    } 
    if (flag < 2) { 
     method2(); 
     if (method2failed) { 
      return 2; 
     } 
    } 
    if (flag < 3) { 
     method3(); 
     if (method3failed) { 
      return 3; 
     } 
    } 
    return 4; 
} 
+0

Questo potrebbe diventare piuttosto complicato se vengono utilizzati più di tre metodi. – Vulcan

Problemi correlati