Лучшие практики для отлова необработанного исключения времени выполнения для JAVA на ОС Android? - PullRequest
4 голосов
/ 03 июня 2011

Во время процесса, который я запускаю во время заполнения сцены 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)

все приложение умирает с диалогом исключения ... Я бынравится иметь возможность отлавливать исключение ConcurrentModificationException из глобальной области видимости, чтобы в случае, если такое событие произошло из-за неизвестных обстоятельств, все приложение не удалялось ..

** EDIT **

во времякажется, что этот блок выстрелил во время 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 {


                    }

вы увидите, что после того, как я ввел логический флаг порождения шара и вторичная процедура, я передаю свои значения порождения, была настолько золотой ... я сделал это полем, и оно устанавливается в конце моей итерации и проверенодо того, как произойдет пересечение списка .. уууууууу !!так сладко!

нет необходимости в глобальном перехватывании .. просто старая добрая отладка.но я все еще хотел бы реализовать глобальный обработчик всех ошибок. TODO

Я снова вспыхнул параллельную ошибку ..

снимки экрана

Отладочные сообщения

Другое вхождение

снимок экрана 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!

Отличный ресурс

Я обнаружил проблему с параллелизмом с помощью

, удалив ...

открытый класс LauncherActivity расширяет E3Activity реализует UncaughtExceptionHandler, FPSListener, SceneUpdateListener

, которые я должен был сделать оригинальным ... без реализации UncaughtExceptionHandler

и добавил класс, который был очень подробно описан Джонни Ли.blog.dimond.de/?p=63

Действительно приятная штука.

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

Я думаю, вы бы предпочли убедиться, что ConcurrentModificationException вообще не происходит.

Это исключение, которое возникает, когда вы итерируете Collection с Iterator.Пока вы выполняете итерацию, вы не можете обновлять коллекцию.Вот сценарий, в котором это может произойти:

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, поскольку мы выполняем итерацию по списку и пытаемся добавить его во время этой итерации.

2 голосов
/ 03 июня 2011

Использование Thread.setUncaughtExceptionHandler:

В качестве аргумента принимается Thread.UncaughtExceptionHandler, который является интерфейсом одного метода: uncaughtException(Thread t, Throwable e).

Из документации:

Установить обработчик, вызываемый, когда этот поток внезапно завершается из-за необработанного исключения.

Излишне говорить, что вы, очевидно, лучше исправляете исключения в их источниках.;-) Однако я использую эту конструкцию самостоятельно для отправки отчетов об ошибках в случае непредвиденных ошибок.

...