"Declaración de retorno faltante" después del cambio (enumeración) - ¿Por qué?
El compilador afirma que falta una declaración de devolución al final deMyClass.parse()
. Aquí está el código:
package de.hs_rm.safelyovertaken.ble;
import android.support.annotation.NonNull;
import java.util.Arrays;
class MyClass {
@NonNull
static MyClass parse(byte[] encoded) throws MyParseException {
MyEnum myEnum = MyEnum.parse(Arrays.copyOfRange(encoded, 0, 2));
switch (myEnum) {
case A:
return new MyClassA();
case B:
return new MyClassB();
case C:
return new MyClassC();
}
// compile error: "Missing return statement"
// return null; // should never be reached
// throw new AssertionError("Should never be reached");
}
}
enum MyEnum {
A, B, C;
@NonNull
static MyEnum parse(byte[] encoded) throws MyParseException {
MyEnum result = null;
// parse logic here
if (result == null) {
throw new MyParseException();
}
return result;
}
}
class MyParseException extends Exception {
}
class MyClassA extends MyClass {
}
class MyClassB extends MyClass {
}
class MyClassC extends MyClass {
}
¿Es correcto el compilador? (Android Studio)
Si es así, ¿en qué circunstancias se podría llegar al final del método? Yo creo quemyEnum
no puede sernull
y todas las enumeraciones están cubiertas en la declaración de cambio donde, en cualquier caso, una declaración de devolución abandonará el método. @myEnum
no puede sernull
porque el@NonNull
métodoMyEnum.parse()
lanza una excepción si el resultado esnull
.
Si no, marcaría el final (con suerte) inalcanzable del método conreturn null // should never be reached
o lanzar unAssertionError
?