1

私のアプリの 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

タイマー ソースを確認し、IAE が発生するのは の場合のみであることを確認しましたがdelay < 0、にチェックを入れてくださいdelay > 0。その上、入力タイプ/数字を無視する設計の悪いカスタム キーボードがない限り (それは可能ですか?)、ユーザーはテキスト フィールドに 0 ~ 9 の数字しか入力できず、マイナス記号やピリオドなどは入力できません。

クラッシュを再現することも、クラッシュが発生しているユーザーと通信することもできないため、デバッグすることはできません。レポートの相対的な数は、私が少し心配するのに十分な数です。

4

1 に答える 1

4

整数がオーバーフローした可能性があります。たとえば、3000000 に 1000 を掛けた値は、32 ビット整数では表現できません。結果はマイナスになります。

于 2013-05-27T22:31:09.043 に答える