导致crash等异常的常见原因分析

Crash:客户端程序运行时遇到无法处理的错误或异常,导致退出应用程序(崩溃);

1.空指针异常
java.lang.NullPointerException

引起NullPointer有两种比较常见的原因:
直接使用一个方法返回的数据,不做NullPoint判断,或不做try catch保护,因此而造成的NullPointer,通常是因为使用者没有考虑到方法会在某些特殊情况会返回null
作为一个公共方法,在不做入参检查的情况下,使用参数

使用前先判定是否为空,是否存在需要引用的元素,防止因为溢出或引用类型不符合的变量导致错误);

2.堆栈溢出(ooM)
java.lang.OutOfMemoryError

OutOfMemoryError通常是两种原因,如下:
存在严重的内存泄露,这种问题如果有内存快照通常都是比较好解决的
对内存的使用不合理,比如内存中有相同图片,对图片缓存的大小设置不合理,对可能造成OOM的地方未捕获。在Android中decode一张图片通常需要比较大的内存,在decode图片的时候也很容易出现OOM,这种情况通常需要进行捕获;
内存泄露,当手机装了一大堆软件之后就会变得非常卡,内存泄露之后正在运行的程序越来越感觉内存不够用,严重的就是不断卡顿然后Crash);

3.数组越界
java.lang.IndexOutOfBoundsException && java.lang.ArrayIndexOutOfBoundsException

这两个异常类似,出现这种异常通常是因为多线程处理数据不同步,出现了越界的情况。比如一个线程在操作一个List的时,另一个线程清空了这个List,这时就会抛出这类异常;
使用如果没有进行new一个对象,直接进行使用,添加元素等等操作,会出现错误 ;

4.应用进程被其他进程中断(如任务管理器);
5.系统反应缓慢,导致应用主线程卡死,请求响应超时;
6.CPU负载过高;
7.控件不匹配

xml文件定义和activity中使用的控件不匹配,或者在activity中试图寻找其他xml文件的控件;

8.死锁
9.运行异常
java.lang.RuntimeException

RuntimeException比较常见的有如下两种原因:
因为系统调用我们实现的Activity的各个周期方法(onCreate,onResume等)或调用Service的onBinde,unBinde失败,系统抛出RuntimeException这个异常,其根本原因是我们实现的如onCreate,onResume等方法抛出了某种异常而导致的
在一个没有调用Looper.prepare()的线程中,通过New Handler()方式创建handler实例

参考:
1.闪退(crash)发生的原因有哪些
https://www.zhihu.com/question/34938240/answer/60494712
2.Android常见Crash原因总结(二)
http://blog.csdn.net/zhangcanyan/article/details/51493279

你可能感兴趣的:(android专项)