您的位置:首页 > 编程语言 > Java开发

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

2016-11-18 15:47 477 查看
今天编程时候遇到一个问题: 

 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信息,然后分析问题,解决问题。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐