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