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

Android Force Close 出现的异常原因分析及解决方法,第1张

概述一、原因:forceclose,意为强行关闭,当前应用程序发生了冲突。NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连AndroidAPI使用的顺序错误也可能导致(比如setContentView()之前进行

一、原因:

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

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

二、如何避免

如何避免d出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;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {// Todo auto-generated method stubsuper.onCreate(savedInstanceState);setContentVIEw(R.layout.activity_main);Log.i("tag","--->>onCreate");initVIEw();//设置处理异常的handlerThread.setDefaultUncaughtExceptionHandler(this);}/*** 初始化控件*/private voID initVIEw() {btn = (button) findVIEwByID(R.ID.main_btn);btn.setonClickListener(this);}@OverrIDepublic voID uncaughtException(Thread arg0,Throwable arg1) {// Todo auto-generated method stubLog.i("tag","截获到forceclose,异常原因为:" + "\n" +arg1.toString()+" Thread:"+arg0.getID());// finish();//结束当前activityandroID.os.Process.killProcess(androID.os.Process.myPID());}@OverrIDepublic voID onClick(VIEw arg0) {// Todo auto-generated method stubswitch (arg0.getID()) {case R.ID.main_btn:mList.get(1) ;//产生异常break;default:break;}}@OverrIDeprotected voID onPause() {super.onPause();Log.i("tag","--》onpause");}@OverrIDeprotected voID onStop() {// Todo auto-generated method stubsuper.onStop();Log.i("tag","--->onstop");}@OverrIDeprotected voID onDestroy() {// Todo auto-generated method stubsuper.onDestroy();Log.i("tag","-->ondestroy");}} 

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

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

public voID uncaughtException(Thread arg0,"截获到forceclose,异常原因为:" + "\n" +arg1.toString()+" Thread:"+arg0.getID());// finish();//结束当前activityandroID.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 {@OverrIDepublic voID run() {// Todo auto-generated method stubThread.setDefaultUncaughtExceptionHandler(this);}@OverrIDepublic voID uncaughtException(Thread arg0,"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: --->>onCreate08-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[];@OverrIDepublic voID run() {// Todo auto-generated method stubThread.setDefaultUncaughtExceptionHandler(this);int i = a[0];//异常}@OverrIDepublic voID uncaughtException(Thread arg0,"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: --->>onCreate08-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-4482908-09 19:08:20.254 16349-16349/example.com.force_anr I/tag: --->>onCreate08-09 19:08:20.354 16376-16376/example.com.force_anr I/tag: --->>onCreate08-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 Force Close 出现的异常原因分析及解决方法全部内容,希望文章能够帮你解决Android Force Close 出现的异常原因分析及解决方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148639.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存