La captura de múltiples excepciones en Java-8

Bufón :

Mientras que probar el multi-captura característica que encontré en mi m1()método de trabajo que todo está bien como se esperaba.

Sin embargo, en m2()el mismo código no se compila. Simplemente he cambiado la sintaxis para reducir el número de líneas de código.

public class Main {

    public int m1(boolean bool) {
        try {
            if (bool) {
                throw new Excep1();
            }
            throw new Excep2();
            //This m1() is compiling  abs fine.
        } catch (Excep1 | Excep2 e) {
            return 0;
        }
    }

    public int m2(boolean b) {
        try {
            throw b ? new Excep1() : new Excep2();
            //This one is not compiling.
        } catch (Excep1 | Excep2 e) {
            return 0;
        }
    }

    private static interface I {
    }

    private static class Excep1 extends Exception implements I {
    }

    private static class Excep2 extends Exception implements I {
    }
}

¿Por qué no el método m2()de compilación?

Eran :

El tipo de la expresión

b ? new Excep1() : new Excep2()

es Exception, ya que es el supertipo común de Excep1y Excep2.

Sin embargo, no se captura Exception, por lo que el compilador se queja de ello.

Si la captura Exception, pasará compilación:

public int m2(boolean b) {
    try {
        throw b ? new Excep1() : new Excep2();
    } catch (Exception e) {
        return 0;
    }
}

He intentado encontrar la entrada JLS que explica el tipo de expresión ternaria condicional en su ejemplo.

Todo lo que pude encontrar fue que esta expresión particular es una 15.25.3. Referencia de expresiones condicionales .

No estoy del todo seguro de si se cuenta como una expresión poli o una expresión independiente. Creo que es independiente (ya que las expresiones poli implican un contexto cesión o un contexto invocación, y no creo que una throwdeclaración de cuenta como uno de esos).

Para una expresión independiente: "Si el segundo y tercer operandos tienen el mismo tipo (que puede ser del tipo null), a continuación, que es el tipo de la expresión condicional".

En su caso, el segundo y tercer operandos tienen tres tipos comunes - Object, Throwabley Exception- el tipo de la expresión debe ser uno de los dos últimos, ya que, "La expresión en un comunicado lanzamiento debe denotar una variable o valor de un tipo de referencia que es asignable (§ 5.2) para el tipo Throwable ".

Parece ser que el compilador recoge el más común tipo específico ( Exception), y por lo tanto un catch (Exception e)soluciona el error de compilación.

También probé a reemplazar sus dos excepciones personalizadas con dos subclases de IOException, en cuyo caso se catch (IOException e)resuelve el error de compilación.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=361790&siteId=1
Recomendado
Clasificación