java.lang.VerifyError IllformedLocaleException

Tengo el siguiente método principal, que se utiliza en todos los casos por varios niveles de API:

public int setVoice (@NonNull final String language, @NonNull final String region){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        return setVoice21(language, region);
    } else {
        return setVoiceDeprecated(language, region);
    }
}

ysetVoice21 hace algo como esto:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int setVoice21 ( @NonNull final String language, @NonNull final String region){

    try {
        // try some API 21 stuff
    } catch (final IllformedLocaleException e) {
        e.printStackTrace();
        return setVoiceDeprecated(language, region);
    }

setVoice21 contiene otro código que requiere API 21+ específicamenteTextToSpeech.Voice yLocale.Builder

Cuando ejecuto este código en un dispositivo <API 21 obtengo el siguiente error:

W / dalvikvm: VFY: no se puede resolver la clase de excepción 6232 (Ljava / util / IllformedLocaleException;) W / dalvikvm: VFY: rechazar el código de operación 0x0d en 0x0168 W / dalvikvm: VFY: rechazar Lcom / myapp / android / speech / MyTextToSpeech; .setVo (Ljava / lang / String; Ljava / lang / String;) IW / dalvikvm: el verificador rechazó la clase Lcom / myapp / android / speech / MyTextToSpeech;

E / AndroidRuntime: EXCEPCIÓN FATAL: main java.lang.VerifyError: com / myapp / android / speech / MyTextToSpeech

Si elimino elIllformedLocaleException y simplemente reemplácelo con una Excepción estándar, la aplicación funciona bien, a pesar de las muchas otras referencias a métodos> API21 ensetVoice21

Para confundirme aún más,setVoice21 invoca la siguiente clase

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private class TTSVoice {

    public void buildVoice() {

        try {
            // Do some API 21 stuff
        } catch (final IllformedLocaleException e) {
        }

    }
}

A esta clase solo se hace referencia desdesetVoice21, pero no tengo que eliminar la referencia a IllformedLocaleException aquí, puedo dejarlo y la aplicación funciona bien ... Desconcertado.

¿Alguien puede ayudarme a explicar por qué la IllformedLocaleException está causando esta falla? ¿Las excepciones se manejan de alguna manera diferente?

Os doy las gracias de antemano.

Nota: no estoy seguro de que sea relevante, pero estoy subclasificandoTexto a voz de manera estándar. Me temo que esto puede complicar la pregunta, pero por si acaso ...

public class MyTextToSpeech extends TextToSpeech {

    public MyTextToSpeech(final Context context, final OnInitListener listener) {
        super(context, listener);
    }
}

EDITAR - La soluciónproporcionado por razzledazzle a continuación, permite que la aplicación se ejecute sin fallar, pero aún sigo sin saber por qué es necesario ese paso. Nunca he tenido que tomar tales medidas antes cuando se trata de versiones de API.

Respuestas a la pregunta(2)

Su respuesta a la pregunta