我有以下父方法,在所有情况下都由各种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:在0x0168 W/dalvikvm: VFY拒绝操作码0x0d : VFY:拒绝接受Lcom/myapp/android/speech/MyTextToSpeech;.setVoice21 (Ljava/lang/String;Ljava/lang/String;)I W/dalvikvm:验证器拒绝的类Lcom/myapp/android/speech/MyTextToSpeech; E/AndroidRuntime:致命异常:主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);
}
}编辑--解决由下面的razzledazzle提供的方法,确实允许应用程序在不崩溃的情况下运行,但对于为什么需要这样的步骤,我仍然不太清楚。在处理API版本控制时,我以前从未采取过这样的措施。
发布于 2016-04-17 04:05:34
通过从catch参数中移除IllformedLocaleException类解决了这个问题。这仍然允许您检查IllformedLocaleException。
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int setVoice21 (@NonNull final String language, @NonNull final String region) {
try {
// try some API 21 stuff
...
} catch (final Exception e) {
e.printStackTrace();
if (e instanceof IllformedLocaleException) {
...
}
}
...
}https://stackoverflow.com/questions/36610941
复制相似问题