java.lang.VerifyError IllformedLocaleException

Ich habe die folgende übergeordnete Methode, die in allen Fällen von verschiedenen API-Ebenen verwendet wird:

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);
    }
}

undsetVoice21 macht so etwas:

@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 enthält anderen Code, für den API 21+ erforderlich is TextToSpeech.Voice und Locale.Builder

Wenn ich diesen Code auf einem Gerät <API 21 ausführe, wird der folgende Fehler angezeigt:

W / dalvikvm: VFY: Ausnahmeklasse 6232 kann nicht aufgelöst werden (Ljava / util / IllformedLocaleException;) W / dalvikvm: VFY: Opcode um 0x0168 ablehnen W / dalvikvm: VFY: Abgelehnt setVoice21 (Ljava / lang / String; Ljava / lang / String;) IW / dalvikvm: Prüfer hat Klasse Lcom / myapp / android / speech / MyTextToSpeech; @ abgeleh

E / AndroidRuntime: FATAL EXCEPTION: main java.lang.VerifyError: com / myapp / android / speech / MyTextToSpeech

Wenn ich das @ entfer IllformedLocaleException und ersetzen Sie es einfach durch eine Standardausnahme. Die App läuft einwandfrei, trotz der vielen anderen Verweise auf Methoden> API21 insetVoice21

Um mich noch weiter zu verwirren,setVoice21 ruft die folgende Klasse auf

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

    public void buildVoice() {

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

    }
}

Diese Klasse wird nur von @ referenziesetVoice21, aber ich muss den Verweis auf IllformedLocaleException hier nicht entfernen - ich kann ihn lassen und die App läuft einwandfre

Kann mir jemand helfen, warum die IllformedLocaleException diesen Fehler verursacht? Werden Ausnahmen irgendwie anders behandelt?

Ich danke Ihnen im Voraus

Hinweis - Ich bin mir nicht sicher, ob es relevant ist, aber ich untergeordnete KlasseText zu Sprach auf übliche Weise. Ich fürchte, das kann die Frage verwickeln, aber nur für den Fall ...

public class MyTextToSpeech extends TextToSpeech {

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

BEARBEITE - Die Problemumgehung bereitgestellt von razzledazzle below, ermöglicht es der App, ohne Absturz zu laufen, aber ich weiß immer noch nicht, warum ein solcher Schritt notwendig ist. Ich musste noch nie zuvor solche Maßnahmen ergreifen, wenn ich mich mit der API-Versionierung befasste.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage