java.lang.VerifyError IllformedLocaleException
У меня есть следующий родительский метод, который используется во всех случаях различными уровнями 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);
}
}
а такжеsetVoice21
делает что-то вроде этого:
@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
содержит другой код, который требует API 21+TextToSpeech.Voice а такжеLocale.Builder
Когда я запускаю этот код на устройстве <API 21, я получаю следующую ошибку:
W / dalvikvm: VFY: невозможно разрешить класс исключений 6232 (Ljava / util / IllformedLocaleException;) W / dalvikvm: VFY: отклонение кода операции 0x0d в 0x0168 W / dalvikvm: VFY: отклонен Lcom / myapp / android / speech / MyTechoToSset (Ljava / lang / String; Ljava / lang / String;) IW / dalvikvm: верификатор отклонен, класс Lcom / myapp / android / speech / MyTextToSpeech;
E / AndroidRuntime: ФАКТИЧЕСКОЕ ИСКЛЮЧЕНИЕ: main java.lang.VerifyError: com / myapp / android / speech / MyTextToSpeech
Если я удалюIllformedLocaleException и просто замените его стандартным исключением, приложение работает нормально, несмотря на множество других ссылок на методы> API21 вsetVoice21
Чтобы запутать меня еще больше,setVoice21
вызывает следующий класс
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private class TTSVoice {
public void buildVoice() {
try {
// Do some API 21 stuff
} catch (final IllformedLocaleException e) {
}
}
}
На этот класс ссылаются только изsetVoice21
, но мне не нужно удалять ссылку на IllformedLocaleException здесь - я могу оставить его, и приложение работает нормально .... озадачен.
Может кто-нибудь помочь мне понять, почему IllformedLocaleException вызывает эту ошибку? Исключения обрабатываются как-то иначе?
Я благодарю вас заранее.
Примечание - я не уверен, что это актуально, но я делаю подклассыТекст в речь стандартным способом. Боюсь, это может усложнить вопрос, но на всякий случай ...
public class MyTextToSpeech extends TextToSpeech {
public MyTextToSpeech(final Context context, final OnInitListener listener) {
super(context, listener);
}
}
РЕДАКТИРОВАТЬ - Обходной путьпредоставлено razzledazzle ниже, позволяет приложению работать без сбоев, но я все еще не знаю, почему такой шаг необходим. Мне никогда раньше не приходилось принимать такие меры при работе с версиями API.