Android Force Close 出现的异常原因分析及解决方法_Android

一、原因:

forceclose,意为强行关闭,当前应用程序发生了冲突。

NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常

二、如何避免

如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtException方法 代码如下:

public class MainActivity extends Activity implements Thread.UncaughtExceptionHandler,
View.OnClickListener {
private List<String> mList = new ArrayList<String>();
private Button btn;
private int pid;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag", "--->>onCreate");
initView();
//设置处理异常的handler
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 初始化控件
*/
private void initView() {
btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "截获到forceclose,异常原因为:" + "\n" +
arg1.toString()+" Thread:"+arg0.getId());
// finish();//结束当前activity
android.os.Process.killProcess(android.os.Process.myPid());
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.main_btn:
mList.get(1) ;//产生异常
break;
default:
break;
}
}
@Override
protected void onPause() {
super.onPause();
Log.i("tag", "--》onpause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i("tag", "--->onstop");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("tag", "-->ondestroy");
}
} 

 再补充一句,想要哪个线程可以处理未捕获异常,Thread.setDefaultUncaughtExceptionHandler( this); 这句代码都要在那个线程中执行一次

在uncaughtException方法中,第一个参数是线程,第二个参数是异常。

public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "截获到forceclose,异常原因为:" + "\n" +
arg1.toString()+" Thread:"+arg0.getId());
// finish();//结束当前activity
android.os.Process.killProcess(android.os.Process.myPid());
} 

 接下来,看log日志的结果:

08-0918:50:27.87410739-10739/example.com.force_anrI/tag:--->>onCreate
08-0918:50:31.66410739-10739/example.com.force_anrI/tag:截获到forceclose,异常原因为:

java.lang.IndexOutOfBoundsException:Invalidindex1,sizeis0Thread:1

成功捕获到了异常,而且activity也退出了,可是并不是安全退出,因为当你再次点击打开apk时,发现程序无响应。

为了解决上述问题,我在uncaughtException方法里将进程杀死,杀死进程有好多中方法,在此列举一个自杀式方法

修改如下:

@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "截获到forceclose,异常原因为:" + "\n" +
arg1.toString());
android.os.Process.killProcess(android.os.Process.myPid()); //
}

其他程序未变。。

3,我们不仅可以在主线程中这么做,还可以在子线程中进行:

然后在activity的生命周期中开启子线程,监听未捕获异常的发生。

class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread:截获到forceclose,异常原因为:" + "\n" +
arg1.toString()+" Thread->"+arg0.getId()+" 本线程id->"+Thread.currentThread().getId()+" "+
Thread.currentThread().getName());
android.os.Process.killProcess(android.os.Process.myPid());
}
}

  这里有个问题:我们明明是在子线程捕获的异常,但是怎么Thread的id->1 本线程id->1,为什么线程是主线程!在下面探讨这个问题。

08-09 19:02:47.734 14483-14483/example.com.force_anr I/tag: --->>onCreate
08-09 19:02:51.304 14483-14483/example.com.force_anr I/tag: childThread:截获到forceclose,异常原因为:
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 Thread->1 本线程id->1 main 

4.解决第三步的问题

我们重写子线程:在子线程里设置异常,同时别忘把activity中的捕获异常的代码和发生异常的代码删除。

class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
int a[];
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
int i = a[0];//异常
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread:截获到forceclose,异常原因为:" + "\n" +
arg1.toString()+" Thread->"+arg0.getId()+" 本线程id->"+Thread.currentThread().getId()+" "+
Thread.currentThread().getName());
android.os.Process.killProcess(android.os.Process.myPid());
}
}

  在启动程序看到下面的log:

08-09 19:08:20.124 16308-16308/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.124 16308-16341/example.com.force_anr I/tag: childThread:截获到forceclose,异常原因为:
java.lang.NullPointerException: Attempt to read from null array Thread->44829 本线程id->44829 Thread-44829
08-09 19:08:20.254 16349-16349/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16376/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16411/example.com.force_anr I/tag: childThread:截获到forceclose,异常原因为:
java.lang.NullPointerException: Attempt to read from null array Thread->44839 本线程id->44839 Thread-44839 

 好像是尝试启动了两次,看下Thread已经变了。所以在这个方法uncaughtException(Thread arg0, Throwable arg1)中的arg0指的是发生异常的那个Thread,而不一定是uncaughtException注册的Thread。

以上所述是小编给大家介绍的Android Force Close 出现的异常原因分析及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, close
force
android force close、force close、安卓force close、手机force close怎办、forceclose,以便于您获取更多的相关知识。

时间: 2024-08-02 20:37:42

Android Force Close 出现的异常原因分析及解决方法_Android的相关文章

微信零钱提现提示交易异常原因分析与解决办法

1.我们先来提现看看,我们在微信中点击[我]点击打开[零钱]如下所示; 2.进入之后我们再点击[提现]选项打开进入效果如下; 3.好了在此填写你要[提现]金额点击提现按钮; 4.输入你绑定银行卡时设定的支付密码; 5.好了这样就提交申请了,之后点击[完成]. 6.如果没有问题就会出现提现成功了,如我们现在点击[账户安全] 7.在弹出的窗口点击打开[交易异常]; 8.好了这是什么原因我们进入然后点击提示界面中的[点击此处]; 9.之后根据向导选择操作之后点击[提交]. 10.如果客服回复之后,还是

win7蓝屏的原因分析及解决方法

蓝屏很多时候都是突然发生的,大多数是发生在你玩游戏的时候.很多时候是由于CPU一下子处理不过来,或者电脑脑脾气了.像中毒.中木马之类的蓝屏现在已经很好很好了,当然除非你的电脑是裸机,这才有可能. 1 如果是在玩游戏或者电脑弄很多东西的时候,蓝屏而且只有一.两次,当然你如果下次还开那么多东西,那么肯定是再次蓝屏了. 一般情况下都是由于CPU超频,或者内存不足,你可以买条大的内存装上去,基本上就没问题了.也有的时候是你电脑太热了导致CPU一直超频,然后蓝屏了. 2 有的时候也有可能是一些软件的不兼容

电脑中无法打开网页并提示堆栈溢出的原因分析及解决方法

  电脑中无法打开网页并提示堆栈溢出的原因分析及解决方法 1.函数调用层次过深,每调用一次,函数的参数.局部变量等信息就压一次栈; 2.局部静态变量体积太大. 解决方法: 1.按win+r打开运行,输入cmd,并按回车; 2.打开命令提示符后,分别输入并执行以下命令: regsvr32 atl.dll regsvr32 shdocvw.dll regsvr32 urlmon.dll regsvr32 browseui.dll regsvr32 oleaut32.dll regsvr32 shel

Win7蓝牙驱动安装失败的原因分析与解决方法

  蓝牙是一种支持设备短距离通信的无线电技术,现在不管是手机还是电脑都已经普遍的使用蓝牙功能了.如果Win7系统电脑没有安装蓝牙驱动的话,是需要安装后才能使用的.最近,有用户在安装蓝牙驱动的时候,发现安装失败.怎么办?出现这样的问题要怎么解决?现在就和大家说一下Win7蓝牙驱动安装失败的原因分析与解决方法. 步骤如下: 一.原因分析: 优化软件将系统INF文件夹自带文件误删了. 二.解决方法: 1.进入C盘系统分区的Windowsinf目录,查看是否有"bth.inf"文件,备注:如果

笔记本电脑电源灯不亮/一直闪烁的原因分析及解决方法

笔记本电脑电源灯不亮/一直闪烁的原因分析及解决方法          一.电源灯不亮 首先说说笔记本电源灯不亮,有两种情形: 对于笔记本外部电源(适配器)上的指示灯不亮,那么可能是适配器没有连接到插座,或者插座处没有电,也有可能是适配器坏了. 如果是笔记本上的电源指示灯不亮,那么则可能是: 1.检查外接适配器是否与笔记本正确连接,外接适配器是否工作正常; 2.如果只用电池为电源,检查电池型号是否为原配电池.电池是否充满电.电池安装的是否正确等; 3.排除前面两种情况后,则可能是笔记本主板电源模块

注册表被修改的原因分析和解决方法

注册表被修改的原因分析和解决方法: 其实,该恶意网页是含有有害代码的ActiveX网页文件,这些广告信息的出现是因为浏览者的注册表被恶意更改的结果. 1.IE默认连接首页被修改 IE浏览器上方的标题栏被改成"欢迎访问******网站"的样式,这是最常见的篡改手段,受害者众多. 受到更改的注册表项目为: HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMainStart Page HKEY_CURRENT_USERSoftwareM

装系统提示:invalid switch fmount原因分析和解决方法

我发现很多人在装系统的时候,遇到提示"invalid switch fmount",就没有办法解决了.在这边我会跟大家分析下出现这个问题的原因和解决方法. 1 装系统提示:invalid switch fmount原因 invalid switch fmount的意思是:你在操作时的命令无效.会产生这个问题的原因是 1:你下载的系统本身就存在问题 2:你电脑存在点问题,没办法进行格式化分区 3:你要装的是双系统,但是2个系统其中有一个不是ghost系统也会导致这样的问题. 2 刚刚遇到

U盘插到电脑上不显示图标的原因分析和解决方法

U盘现在已经是人手必备的工具了,但是好像也不能这样说了,因为现在手机很多时候就是一个移动U盘.但是很多时候U盘插到电脑上不管计算机还是右下角小图标都没显示U盘,这就让我们很郁闷了.下面小编跟你分享下解决这些问题的方法吧! 1 使用量产工具造成的没图标 解决方法:解决的方法是在安国的量产工具中就有一个卸载的小工具,点击"卸载". 2 看下是不是系统问题 在其他电脑看下U盘能不能使用,如果能使用那么就是系统问题了,基本上要靠重装才能解决了.这问题小编还没想到哪里出错. 3 U盘驱动有问题

Ajax向后台传json格式的数据出现415错误的原因分析及解决方法_AJAX相关

问题描述: ajax往后台传json格式数据报415错误,如下图所示 页面代码 function saveUser(){ var uuId = document.getElementById("uuid").value; var idCard = document.getElementById("idCard").value; alert(uuId+idCard); // var result = new Object(); // result.uuId = uuI