【发布时间】:2016-08-05 06:56:47
【问题描述】:
我有以下父方法,在所有情况下都被各种 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
当我在设备
W/dalvikvm: VFY: 无法解析异常类 6232 (Ljava/util/IllformedLocaleException;) W/dalvikvm: VFY: 拒绝 操作码 0x0d 在 0x0168 W/dalvikvm: VFY: 被拒绝 Lcom/myapp/android/speech/MyTextToSpeech;.setVoice21 (Ljava/lang/String;Ljava/lang/String;)I W/dalvikvm: 验证器被拒绝 类 Lcom/myapp/android/speech/MyTextToSpeech;
E/AndroidRuntime: 致命异常: main java.lang.VerifyError: com/myapp/android/speech/MyTextToSpeech
如果我删除IllformedLocaleException 并将其替换为标准异常,应用程序运行良好,尽管setVoice21 中有许多其他方法引用> API21
让我更困惑的是,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 会导致这个失败?异常的处理方式是否有所不同?
提前谢谢你。
注意 - 我不确定它是否相关,但我正在以标准方式继承 TextToSpeech。我担心这可能会使问题复杂化,但以防万一......
public class MyTextToSpeech extends TextToSpeech {
public MyTextToSpeech(final Context context, final OnInitListener listener) {
super(context, listener);
}
}
编辑 - 解决方法provided by razzledazzle below 确实允许应用程序运行而不会崩溃,但我仍然不知道为什么需要这样的步骤。在处理 API 版本控制之前,我从来没有采取过这样的措施。
【问题讨论】:
-
你的意思是当你直接调用
setVoice21()时遇到了这个错误? -
@razzledazzle 没有。只有
setVoice。因此问题 -
这很有趣。接听,期待直接电话。如果还没有,您也可以尝试进行干净的构建。
-
@razzledazzle 多次清理和重建。
-
删除该答案以避免混淆。
标签: java android exception verifyerror