1

我在我的一个应用程序中遇到了一份崩溃报告,这似乎是我的代码中不应该发生的事情......

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 我检查了 Timer 源并验证 IAE 应该只发生在delay < 0,但我检查一下delay > 0。最重要的是,除非有一些设计不佳的自定义键盘会忽略输入类型/数字(这甚至可能吗?),否则用户只能在文本字段中输入数字 0-9,不能输入负号或句点或其他任何内容。

由于我无法重现崩溃或与遇到它的任何用户交流,我无法调试它。报告的相对数量足以让我有点担心。

4

1 回答 1

4

整数可能溢出了。例如值 3000000 乘以 1000 不能用 32 位整数表示。结果将是否定的。

于 2013-05-27T22:31:09.043 回答