【问题标题】:Best practices for trapping a unhandle runtime Exception for JAVA on the Android os?在 Android 操作系统上为 JAVA 捕获未处理运行时异常的最佳实践?
【发布时间】:2011-06-14 13:06:22
【问题描述】:

在我在 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)

整个应用程序因异常对话框而死。我希望能够从全局范围内捕获 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 boolean flag 并且我传递我的 spawning 值的辅助过程之后,我将它设置为一个字段,并在我的迭代结束时设置它并在之前检查列表的横向发生了..哇哦!好甜蜜!

没有真正需要全局陷阱.. 只是很好的旧调试。但我仍然很想实现所有错误的全局处理程序。 待办事项

我又爆发了并发错误..

截图

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 

在运行时额外的未实现方法

@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

Caught Exception

感谢所有让我努力深入了解 Java 异常处理的原因!!

Excellent Resource

我把并发问题困在了

删除...

公共类 LauncherActivity 扩展 E3Activity 实现 UncaughtExceptionHandler ,FPSListener,SceneUpdateListener

我必须原创...没有 UncaughtExceptionHandler 实现

并添加了 Johnny Lee 非常详细的课程。 blog.dimond.de/?p=63

真的很甜。

【问题讨论】:

    标签: java android exception-handling concurrentmodification


    【解决方案1】:

    我认为您宁愿确保 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,因为我们正在迭代一个列表并尝试在迭代发生时添加到它。

    【讨论】:

    • 哦,当然..在一般的模糊测试期间,最好有一个所有异常的全局处理程序......就像让磁铁靠近手机......这会很好反模糊任何不良数据的做法。 :) 哈哈,我喜欢你如何确认发生的 pre ConcurrentModificationException 。 “准备好女士们,先生们……是时候犯错了……”
    • 我认为你在那个方面一针见血。我放了一个简单的标志,在我关闭线程之前设置它......哇..有什么不同..
    【解决方案2】:

    使用Thread.setUncaughtExceptionHandler:

    它采用Thread.UncaughtExceptionHandler 作为参数,它是一种方法的接口:uncaughtException(Thread t, Throwable e)

    来自文档:

    设置当该线程由于未捕获的异常而突然终止时调用的处理程序。

    不过,不用说,您显然最好从源头修复异常。 ;-) 然而,我确实使用这个构造来发送错误报告,以防出现不可预见的错误。

    【讨论】:

    • 我会看看我可以做些什么来实现 setUncaughtExceptionHandler,因为我没有爆发更多的并发错误。
    • 有趣的是,当异常发生时 void uncaughtException(Thread t, Throwable e) 没有被抛出......正如您在最后一个屏幕截图中看到的那样,日志显示没有 uncaughtException 的痕迹**********
    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2021-06-14
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多