我在我的一个应用程序中遇到了一个崩溃报告,似乎是我的代码中永远不会发生的......
java.lang.IllegalArgumentException
at java.util.Timer.schedule(Timer.java:461)
at com.pilot51.voicenotify.Service.onAccessibilityEvent(Service.java:177)
at android.accessibilityservice.AccessibilityService$IEventListenerWrapper.executeMessage(AccessibilityService.java:215)
at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4633)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
以下是该修订的相关代码:
int delay = 0;
try {
delay = Integer.parseInt(Common.prefs.getString("ttsDelay", null));
} catch (NumberFormatException e) {}
if (delay > 0) {
final String msg = newMsg;
new Timer().schedule(new TimerTask() { // This is line 177
public void run() {
speak(msg, true);
}
}, delay * 1000);
}
完整来源:https://github.com/pilot51/voicenotify/blob/v1.0.9.1/src/com/pilot51/voicenotify/Service.java
我检查了定时器源并验证了IAE只应在delay < 0
时发生,但我检查delay > 0
。除此之外,除非有一些设计不良的自定义键盘忽略输入类型/数字(甚至可能?),用户只能在文本字段中输入数字0-9,没有负号或句号或其他任何内容。<登记/>
由于我无法重现崩溃或与遇到它的任何用户进行通信,因此无法对其进行调试。报告的相对数量足够高,让我有点担忧。
答案 0 :(得分:4)
整数可能已经超过了。例如,值3000000乘以1000不能用32位整数表示。结果将是负面的。