2012-02-16 5 views
9

Sto scrivendo un programma di valutazione per un compito in cui gli studenti stanno implementando algoritmi di ordinamento ricorsivo. Ciò significa che diversi studenti probabilmente trasformeranno il codice in errore, il che causerà un eccesso di stack. Mi piacerebbe in qualche modo catturare gli overflow di stack che si verificano quando si chiama il codice studenti in modo da poter detrarre dal loro punteggio e continuare su altri test. Sfortunatamente, lo stack overflow non sembra passare attraverso il percorso standard di altre eccezioni: i blocchi try/catch non sembrano aiutare. C'è un modo per restituire l'esecuzione al mio codice dopo che si è verificato un overflow dello stack? Ho cercato di utilizzare i thread per farlo, ma sembra tornare a non essere in grado di usare try/catch.Come posso rilevare e recuperare da un overflow di stack in Java?

risposta

14

Quando si chiamano i metodi degli studenti, è necessario incorporare le chiamate nei blocchi try-catch e catturare Exception s come Throwables.

vedere il codice seguente:

 
public class Test { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     try { 
      soe(); 
     } catch (Throwable e) { 
      System.out.println("Caught:" + e 
        + ", everything went better than expected."); 
     } 
    } 
    /** 
    * Method producing StackOverflowError 
    */ 
    public static void soe() { 
     soe(); 
    } 
} 

Maggiori informazioni

Quando cattura Throwable s si cattura:

  • normali Exception s - che far rispettare l'uso try-catch o throws (ad esempio IOException)
  • RuntimeException s - che esplodono attraverso i metodi (ad es. NullPointerException)
  • Error s - ad es. StackOverflowError

Vedi l'official Java Docs sul Throwable oggetto

+1

Questo. Gli errori e le eccezioni sono entrambe sottoclassi di Throwable, che è il motivo per cui gli errori passano attraverso le normali eccezioni. È progettato in questo modo in modo che i guasti critici (che è quello che gli errori sono in Java) non siano facilmente aggirabili dai programmatori. –

+0

@IbrahimArief: Grazie per aver puntato alle basi. Questo aiuta – Jayy

+0

Eccellente, grazie! – Solaraeus

2

È possibile attivare i programmi utilizzando un nuovo Process e quindi reindirizzare il flusso di errori per verificare l'overflow dello stack.

+0

Non ce n'è bisogno - vedi la risposta di Matyas sotto. –

1

Si potrebbe provare a eseguire ogni programma in una JVM separata.

Problemi correlati