2013-05-27 69 views
1

我在我的應用程序,似乎什麼東西在我的代碼不應該發生的一個遇到崩潰報告...定時器拋出:IllegalArgumentException與正延遲

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,沒有負號或句點或其他任何內容。

由於我無法重現崩潰或與任何遇到它的用戶通信,我無法對其進行調試。報告的相對數量足以讓我有點擔心。

回答

3

整數可能會飛過來。例如,值3000000乘以1000不能用32位整數表示。結果會是負面的。

+0

好暗示!作爲一個快速修復:使用長 – Enno

+0

謝謝!在發佈之前,我嘗試將它設置爲一個可以超出很長範圍的可笑的大數目,並且沒有崩潰(當NFE被捕獲時,它保持爲0)。我沒有考慮測試範圍內的大數,因爲我不知道它們在超出範圍計算時變得消極,並且沒有想到。現在我明白了。快速修復就是將'1000'改成'1000L',這樣就可以通過了。還有一個謎團:爲什麼有人會在2147484和2147483647秒之間設置一個延遲? –

相關問題