2012-02-16 8 views
9

Estoy escribiendo un programa de calificación para una tarea en la cual los estudiantes están implementando algoritmos de ordenamiento recursivo. Esto significa que varios estudiantes probablemente entreguen código dañado que causa el desbordamiento de la pila. Me gustaría de alguna manera atrapar los desbordamientos de pila que se producen al llamar al código de los estudiantes para que pueda deducir de su puntaje y continuar a otras pruebas. Desafortunadamente, el desbordamiento de pila no parece pasar por la ruta estándar de otras excepciones: los bloques try/catch no parecen ayudar. ¿Hay alguna manera de devolver la ejecución a mi código después de que se haya producido un desbordamiento de la pila? He analizado el uso de subprocesos para hacer esto, pero parece volver a no poder usar try/catch.¿Cómo atrapo y me recupero de un desbordamiento de pila en Java?

Respuesta

14

Al llamar a los métodos de sus alumnos, debe incrustar las llamadas en bloques try-catch y capturar Exception s como Throwables.

Véase el siguiente código:

 
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(); 
    } 
} 

Más información

Cuando la captura de Throwable s que se captura:

  • normales Exception s - que imponen su uso try-catch o throws (por ejemplo, IOException)
  • RuntimeException s - que burbujean a través de métodos (ej. NullPointerException)
  • Error s - por ejemplo. StackOverflowError

Véase el official Java Docs en el Throwable objeto

+1

Esto. Los errores y las excepciones son ambas subclases de Throwable, por lo que los errores pasan por la captura de excepciones normal. Está diseñado de esa manera, por lo que los programadores no evitarán fácilmente las fallas críticas (que es lo que los errores son en Java). –

+0

@IbrahimArief: gracias por señalar lo básico. Esto ayuda a – Jayy

+0

Excelente, gracias! – Solaraeus

2

Puede disparar sus programas utilizando un nuevo Process y luego redirigir su flujo de error para comprobar el desbordamiento de la pila.

+0

No hay necesidad de eso; consulte la respuesta de Matyas a continuación. –

1

Se podría intentar ejecutar cada programa en una JVM por separado.

Cuestiones relacionadas