2011-06-03 15 views
4

在我在android的e3roid場景羣體中觸發的過程中,我不斷遇到我想要完全陷入的異常。也許我需要創建一個後退異常跟蹤器,以便我可以在閒暇時橫穿而不是立即對話,從而帶走用戶體驗。捕獲Android操作系統上JAVA的未處理運行時異常的最佳實踐?

W/dalvikvm(9540): threadid=1: thread exiting with uncaught exception (group=0x2 
aac87c8) 
E/AndroidRuntime(9540): FATAL EXCEPTION: main 
E/AndroidRuntime(9540): java.util.ConcurrentModificationException 
E/AndroidRuntime(9540):  at java.util.ArrayList$ArrayListIterator.next(Ar 
rayList.java:573) 

整個應用程序有一個例外對話死..我很想能夠捕獲從全球範圍ConcurrentModificationException的,這樣,如果這樣的事件發生,由於未知的情況下,整個應用程序沒有得到處置。 。

**此塊中編輯**

期間onSceneTouchEvent

try { 


     postUpdate(new AddShapeImpl(scene, onX, onY)); 

    } finally { 

    } 

被炒過,似乎我解僱我認爲太快了。我需要放慢速度。

*跟進*

我似乎解決了這個問題。我做了其中的一個......

if ( ballspawning == false) 

        try { 
         Log.v(DEBUG_TAG, "onSceneTouchEvent 1-1"); 


         addnewball(scene, onX, onY); 



         Log.v(DEBUG_TAG, "onSceneTouchEvent 1-2"); 
        } finally { 


        } 

你會看到,我把一個ballspawning布爾標誌後和一個次要程序,我通過我產卵的價值是如此的金...我做了一個字段,它被設置在我的迭代結束,並在列表的橫向發生之前檢查..哇!太貼心了!

沒有真正需要全球陷阱..只是很好的舊調試。但我仍然很想實現所有錯誤的全局處理程序。 TODO

我再次爆發的併發錯誤..

截圖

Debug Msgs

Another Occurrence

screen shot 4

almost narrowing down culprit

我試圖抓住ConcurrentModificationException的一個

void uncaughtException(Thread t, 
      Throwable e){ 

    Log.v(DEBUG_TAG, "uncaughtException **********"); 
    Log.v(DEBUG_TAG,"thread " + t + " Throwable" + e.toString());  
    } 

,你可以在上面的方法不會被調用的最後一個截圖中看到。

ConcurrentModificationException將應用程序崩潰到異常對話框..

**跟進**

我已經加入

public class LauncherActivity extends E3Activity implements UncaughtExceptionHandler ,FPSListener,SceneUpdateListener 

和運行期間的額外Unimplimented方法

@Override 
public void uncaughtException(Thread t,Throwable e) { 

    Log.v(DEBUG_TAG, "uncaughtException **************"); 
    Log.v(DEBUG_TAG,"thread " + t + " Throwable" + e.toString()); 


} 

,仍然沒有異常捕獲...

我也加了

newThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){ 

      @Override 
      public void uncaughtException(Thread t, Throwable e) { 

       Log.v(DEBUG_TAG,"*************** ERROR! An exception occurred in " + t.getName() + ". Cause: " + e.getMessage()); 
      } 
      }); 

     newThread.start(); 

並沒有仍然沒有捕捉...

唉唉

WHOO HOO!

剛剛發現異常!看看屏幕截圖...你會看到!!!!!!

http://img17.imageshack.us/img17/135/concurrentmodificatione.png

Caught Exception

THX一切讓我在獲得對Java的異常處理下努力工作!

Excellent Resource

我通過

移除...

公共類LauncherActivity被困的併發問題延伸E3Activity實現的UncaughtExceptionHandler,FPSListener,SceneUpdateListener

,我不得不原.. 。沒有UncaughtExceptionHandler實現

並添加了Johnny Lee非常詳細的課程。 blog.dimond.de/?p=63

真的很甜。

回答

2

使用Thread.setUncaughtExceptionHandler

它需要一個Thread.UncaughtExceptionHandler作爲參數,它是一種方法的一個接口:uncaughtException(Thread t, Throwable e)

從文檔:

設置處理,由於未捕獲到異常時調用該線程突然終止。

不用說,不過你明顯更好地修復源代碼中的異常。 ;-)但是,如果發生無法預料的錯誤,我會使用這個構造來發送錯誤報告。

+0

我會看到我能做些什麼來實現setUncaughtExceptionHandler,因爲我沒有拋出更多的併發錯誤。 – 2011-06-13 11:24:43

+0

有趣的是如何在發生異常時拋出異常uncaughtException(線程t, Throwable e)...正如您在上一個屏幕截圖中看到的那樣,日誌顯示沒有跟蹤 _uncaughtException ******* *** _ – 2011-06-14 03:12:47

2

我想你應該確保ConcurrentModificationException根本不會發生。

這是一個例外,當您使用它的Iterator迭代Collection時出現異常。在迭代過程中,您無法更新集合。這裏是會出現的情景:

List<Integer> intList = new ArrayList<Integer>(); 
for (int i=0; i < 100; ++i) { 
    intList.add(i); 
} 

int addValue = 1000; 
for (Integer i: intList) { 
    if (i%10 == 0) { 
     //get ready for ConcurrentModificationException... 
     intList.add(++addValue);//this is bad, because we are iterating over intList. 
    } 
} 

這會導致ConcurrentModificationException的,因爲我們遍歷一個列表,並嘗試添加到它,而迭代發生。

+0

ohh當然..在模糊測試期間,一般來說,擁有一個全局例外處理器是明智的,儘管...可以說磁鐵靠近手機......這將是反模糊的良好實踐任何不良數據。 :)哈哈我喜歡你如何確認前ConcurrentModificationException發生。 「準備好女士們和紳士們......出錯的時間......」 – 2011-06-03 06:16:27

+0

我認爲你在那個問題上嚴厲打擊。我放了一個簡單的標誌,在我開始線程之前被設置。哇..有什麼區別.. – 2011-06-03 06:39:06