Pregunta

Supongamos que tengo el siguiente código:

public class MainClass {
    public static void main(String[] args) {
        System.out.println(sumNumbers(10, 10));
    }

    //@requires a >= 10;
    //@ensures \result < 0;
    public static int sumNumbers(int a, int b) {
        return a+b;
    }
}

Puedo hacer 2 cosas aquí:

Utilice contratos de código (en este caso, lo que está en los comentarios).Cuando se ejecuta sumNumbers y < 10, se generará inmediatamente una excepción (aunque no parece ser muy descriptivo):

Exception in thread "main" org.jmlspecs.jmlrac.runtime.JMLInternalNormalPostconditionError: by method MainClass.sumNumbers
    at MainClass.sumNumbers(MainClass.java:500)
    at MainClass.internal$main(MainClass.java:9)
    at MainClass.main(MainClass.java:286)

o...

Lanza una excepción.La excepción puede ser tan descriptiva como quiera.También me gustaría verificar el final de la función para ver si las condiciones de la publicación son verdaderas o no.

¿Cuál usarías aquí y por qué?

¿Fue útil?

Solución

Me gusta la idea de los contratos de código, pero el IllegalArgumentException descriptiva (o similar) consejos para mí. Es mucho más clara en un papel de apoyo / producción (o incluso un desarrollo) para obtener un mensaje de excepción explícita, lo que le da una ventaja en el diagnóstico lo que va mal (si un sistema está roto, o si está mal uso de una API durante el desarrollo ).

Otros consejos

¿Espera que se pasen entradas no válidas a este argumento durante el funcionamiento normal de su programa?Si es así, ¿puedes recuperarte de ello?

Si es así, las excepciones marcadas son el camino a seguir.

Si no puede recuperarse de este tipo de caso, entonces conviértalo en un contrato y falle estrepitosamente, pero en cualquier caso usaría un mensaje de error descriptivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top