"Declaração de retorno ausente" após a troca (enum) - Por quê?
O compilador afirma que uma instrução de retorno está ausente no final deMyClass.parse()
. Aqui está o 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 {
}
O compilador está certo? (Android Studio)
Em caso afirmativo, em que circunstâncias o fim do método poderia ser alcançado? eu acho quemyEnum
não pode sernull
e todo o enum é coberto na instrução switch onde, em qualquer caso, uma instrução return retornará ao método.myEnum
não pode sernull
porque o@NonNull
métodoMyEnum.parse()
lança uma exceção se o resultado fornull
.
Caso contrário, você marcaria o final (espero) inacessível do método comreturn null // should never be reached
ou jogue umAssertionError
?