簡體   English   中英

在 Android 操作系統上捕獲 JAVA 的未處理運行時異常的最佳實踐?

[英]Best practices for trapping a unhandle runtime Exception for JAVA on the Android os?

在我在 android 上的 e3roid 場景填充期間啟動的過程中,我不斷遇到我想要完全捕獲的異常。 也許我需要創建一個反向異常跟蹤器,我可以在閑暇時橫穿它,而不是立即進行對話,從而消除用戶體驗。

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)

整個應用程序因異常對話框而死。我希望能夠從全局 scope 中捕獲 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 {


                    }

你會看到,在我放入一個生成球的 boolean 標志之后,我傳遞我的生成值的輔助程序是如此的黃金......我將它設置為一個字段,並在我的迭代結束時設置它並在橫向清單發生了..哇哦! 好甜蜜!

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

我再次爆發了並發錯誤..

截圖

調試消息

另一種情況

屏幕截圖 4

幾乎縮小了罪魁禍首

我試圖用一個捕捉 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 

在運行時額外的未實現方法

@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();

沒有仍然沒有誘捕...

啊啊啊

呼呼!!

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

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

捕獲異常

感謝所有這一切讓我努力深入了解 java 異常處理!

優秀的資源

我把並發問題困在了

刪除...

public class LauncherActivity 擴展 E3Activity 實現 UncaughtExceptionHandler,FPSListener,SceneUpdateListener

我必須原創......沒有 UncaughtExceptionHandler 實現

並添加了由 Johnny Lee 詳細介紹的 class。 blog.dimond.de/?p=63

真是甜蜜的東西。

使用Thread.setUncaughtExceptionHandler

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

從文檔中:

設置當此線程由於未捕獲的異常而突然終止時調用的處理程序。

然而,不用說,您顯然最好從源頭修復異常。 ;-) 然而,我確實使用這個構造我自己來發送錯誤報告,以防出現不可預見的錯誤。

我認為您寧願確保 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,因為我們正在迭代一個列表並嘗試在迭代發生時添加到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM