"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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta