W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419b4c50)



今天编程时候遇到一个问题: 

 W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419b4c50) 
。。。。

log完全没有,,,这个时候有心杀贼,无力回天啊,,,,什么报错信息都没有。


百度各种问题解决方案,最终有一篇文章:http://blog.csdn.net/liqiangeastsun/article/details/43986605  讲了一个解决问题的方案:

以下是原文:

Android错误threadid=1: thread exiting with uncaught exception (group=0x416298c8)

在项目开发中测试时崩溃,错误如上 
该错误的意思是线程中存在没有捕获到的异常。一般情况下捕获异常使用

 try 
 {
 } 
 catch (Exception e)
 {
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

但是在线程池中,线程池在执行任务时捕获了所有异常,这样一来线程中所有的异常都无法捕获到抛出的异常。 
即 try catch 捕获不到异常了。 
Java中有一个接口,UncaughtExceptionHandler 描述如下:

static interface Thread.UncaughtExceptionHandler 
// 当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。
  • 1
  • 2
  • 1
  • 2

Thread类中的一个方法

static void
setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 
//设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

我们需要实现这样一个接口UncaughtExceptionHandler,然后在程序的主线程中设置处理程序。 
代码如下


import java.lang.Thread.UncaughtExceptionHandler;

//implements UncaughtExceptionHandler
public class Other extends Activity implements UncaughtExceptionHandler {


//必须实现接口uncaughtException
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
        //在此处理异常, arg1即为捕获到的异常  
        Log.i("AAA", "uncaughtException   " + arg1);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

现在还无法捕获到线程中的异常,还需要调用一个方法

Thread.setDefaultUncaughtExceptionHandler(this);
  • 1
  • 1

在OnCreate方法中调用一下即可

@Override
protected void onCreate(Bundle savedInstanceState) {
    //在OnCreate方法中调用下面方法,然后再使用线程,就能在uncaughtException方法中捕获到异常
    Thread.setDefaultUncaughtExceptionHandler(this);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

完整代码如下

    //导入包
    import java.lang.Thread.UncaughtExceptionHandler;

    //implements UncaughtExceptionHandler
    public class Other extends Activity implements UncaughtExceptionHandler       {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.th);
        //在此调用下面方法,才能捕获到线程中的异常
        Thread.setDefaultUncaughtExceptionHandler(this);

        //获取创建的 Button
        btn1 = (Button) findViewById(R.id.btn);
        //给btn1添加一个点击监听事件
        btn1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                //调用我自己的方法
                Init();
            }
        });
    }

     public void Init() {
        //开启线程
        new Handler(Looper.getMainLooper()).post(new Runnable() {   
            @Override
            public void run() {
                //此处的 try catch 是无法捕获到异常的
                try {
                    //////////////////////////////////////////
                    //需要在线程中调用的方法purchase.init(context, iapListener)
                    purchase.init(context, iapListener);
                    //////////////////////////////////////////
                } catch (Exception e) {
                    // TODO: handle exception
                    Log.i("AAA", "INIG   " + e);
                    e.printStackTrace();
                }
            }
        });
    }

    //必须实现接口uncaughtException
    @Override
    public void uncaughtException(Thread arg0, Throwable arg1) {
        //在此处理异常, arg1即为捕获到的异常
        Log.i("AAA", "uncaughtException   " + arg1);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

这样再次运行就会捕获到线程中的异常,不会导致项目直接崩溃




最终可以打印出log信息了,报错为:(Android5.0以上没这个问题,5,0以下有问题的)
    java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 

问题已经很明显了,类强转时候报的问题:

    解决方案: 
android.view.ViewGroup.LayoutParams
改为:
android.widget.AbsListView.LayoutParams



这个问题到不是很关键,主要问题是找到了方法,当log不能显示异常信息时候,,,,可以帮我们打印出log信息,然后分析问题,解决问题。。。。



你可能感兴趣的:(原创文档)