Android常见CRASH
来源:互联网 发布:网络打印机主机 编辑:程序博客网 时间:2024/06/05 05:59
InflateException:Binary XML file
加载出错:二进制XML文件
XML文件引用自定义控件或者本身书写不符合规范引起的
NoSuchMethodError
由于不同android版本提供方法的参数不同引发报错
NullPointException
(空指针异常)
直接对网络请求返回的空json解析,app可能崩溃
在处理接口返回数据加上非空判断或者try-catch语句
数据库查询得到空的cursor对象,直接调用cursor.hasNext()方法
调用该方法前加cursor的非空判断,使用完毕后调用cursor.close()来关闭
new File(filePath),filepath不存在
先判断filePath是否存在
SQLiteDiskIOException:disk I/O error
数据库磁盘IO操作异常
webView中使用到数据库作为缓存,读写缓存异常引发崩溃。
webView有两种缓存:网页数据缓存和HTML5缓存
判断如果有网络,使用LOAD_DEFAULT缓存模式,否则使用缓存模式LOAD_CACHE_ELSE_NETWORK。
多线程操作数据库引发磁盘读写错误
考虑到多线程同时操作数据库,建议在操作数据库的方法加上syncronized关键字
SQLException:cannot commit-no transaction is active
数据库异常:无法提交—事务不处于活动状态
在事务中,逐条循环插入(for + insert)大量数据时会导致此类 崩溃
因为android在SQLite插入数据时默认一条语句就是一个事务。解决方法是采用sql语句加上事务机制,操作完毕设置事务成功,把数据同步给数据库。
private static ContactDBManager mInstance = new ContactDBManager(ContactApplication.getInstance());
public static ContactDBManager getInstance() {
return mInstance;
}
OutOfMemoryException
内存溢出
在AndroidManifest.xml文件加上这个语句:
<application android:largeHeap = true>
SQLiteDatabaseLockedException:database is locked
数据库被锁异常
试图在不同线程中创建多个数据库连接时,就会抛出此异常
将数据库设置为单例模式。如果是多进程,应该考虑使用Contentprovider
尽量避免内存泄露,因为内存泄露多了最终会引发内存溢出;不要频繁创建对象(能够复用就复用);涉及多线程编程,使用线程池管理(
JSONException:no value for XXX
(json解析溢出)
用getString("name")而不是optString("name"),并且name这个key值在json字符串中不存在,前者会抛出异常,后者则会返回空值
建议使用opt的方法,类似的还有
getJSONArray
StringIndexOutOfBoundsException
ArrayIndexOutOfBoundsException
字符串或数组下标越界
StringIndexOutOfBoundsException
预判断原字符串长度,保证start与end不超出原长度
ArrayIndexOutOfBoundsException
预判断数组非空长度大于零,和数组长度
CursorWindowAllocationException:cursor window allocation of 2048KB failed
(游标窗体分配异常)
使用数据库查询时,忘记关闭游标导致的,内存泄露得多了,就导致崩溃。
手动关闭cursor。
if(cursor != null && !cursor.isClosed())
cursor.close();
Attempt to invoke virtual method on a null object reference
数据类型转换异常
数字转换错误
ClassCastException
安全类型转换函数
String str = (String)x
判断数据源是否为空,并且如果转换出错,返回默认值
NumberFormatException
加try-catch处理,并且转换失败时返回默认值
ConcurrentModificationException
并发修改异常
多个线程修改同一个集合的元素,引起的异常
多线程操作共享变量加同步锁
NoClassDefFoundError
没有找到类定义的错误
dex分包导致,方法数超过65535
在主模块gradle的defaultConfig里面加上:multiDexEnabled true。并且你的application继承MultiDexApplication。
ActivityNotFoundException
找不到Activity异常
Intent里传递的URL不是以“http”开头的
手机没有安装第三方的app,找不到对应的activity
Fragment not attached to Activity
Fragment没有关联到Activity异常
Fragment还没有Attach到Activity,就调用诸如getResource()方法
在获取资源之前先用isAdded()方法判断,如果为true才允许调用获取资源方法
Parcelable encountered IOException writing serializable object(parcelable
parcelable 写序列化对象时遇到异常
序列化了一些不支持序列化的对象:
实体、JSONOjbject、JSONArray等
The content of the adapter has changed but ListView did not receive a notification
(adapter数据发生改变但列表没更新)
(1)调用Activity的runOnUiThread()方法;
(2)调用handler,通知主线程修改adapter;
(3)调用AsyncTask异步任务。
IndexOutOfBoundsException:Invalid index 30,size is 0.
ListView或者类似列表处于滚动时点击刷新造成的
当listView处于滚动时,设置刷新按钮不可点击。
IllegalArgumentException:View not attached to window manager
非法参数异常,视图没有关联到窗体管理器)
当Dialog调用dismiss方法时,WindowManager发现Dialog所属的Activity已经不存在,所以抛出此异常
调用dismiss方法关闭对话框前,先判断Dialog所属的Activity是否存在并且Dialog是否处于open状态
使用Activity相应的操作对话框回调:onCreateDialog、showDialog、dismissDialog、removeDialog,确保与Activity的生命周期一致。
在Activity中使用ViewFlipper控件,进行横竖屏切换操作时就会发生此异常
onDetachedFromWindow()在onAttachedToWindow()之前被调用引起的,因为还没有关联到对应窗体,就从窗体解除关联。我在做垂直滚动公告时,使用ViewFlipper控件就碰到该问题。后来自定义一个控件继承ViewFlipper重写onDetachedFromWindow()方法,里面加上try-catch。
ViewGroup的offRectBetweenParentAndChild方法抛出的。该方法用来计算父子的重叠区域。它是通过所给的descendant这个view逐级向上寻找Parent View,同时将Rect转换为同级坐标系来计算。如果在UI发生改变后,就会改变当前界面所拥有焦点的控件,就会引发此问题
每次都重新设置焦点,保证当前View始终获得焦点。与此同时,还要清空其他控件抢占的焦点
CalledFromWrongThreadException
调用的线程不对引起异常
在子线程修改UI引起的,而Android系统规定只有主线程才能执行更新界面操作
StackOverFlow
栈溢出
无限递归入栈,造成栈溢出
在App退出时,有多个线程在运行,调用finish方法,无法及时全部关闭。那么,需要调用System.exit(0)方法来退出。
UnsatisfiedLinkError:dalvik.system.PathClassLoader
不满足链接错误
无法加载到对应的so库。
jniLibs目录下只有armeabi架构的so文件
在jniLibs目录下添加armeabi-v7a架构对应so文件
Unable to find app for caller android.app.ApplicationThreadProxy when stopping service Intent
(Intent传值太大报错)
bundle携带超过1M数据,就会抛出该异常,而Bitmap往往会超过1M。
Package manager has died
包管理器已经不存在
每次获取PackageManager时使用try-catch捕获异常
IllegalStateException:Can not perform this action after onSaveInstanceState
不合法状态异常
commit方法在Activity的onSaveInstanceState()之后被调用就会报错。
onSaveInstanceState方法是在Activity即将被销毁前调用,
将commit替换成commitAllowingStateLoss()。
本文绝大部分内容来自 <http://blog.csdn.net/u011686167/article/details/52738255>
- Android常见CRASH
- Android常见Crash原因
- Android常见Crash类型分析(一)
- Android常见Crash原因总结(二)
- 常见Crash问题整理
- iOS常见Crash解决方法
- Android crash
- Android Crash
- Android crash
- iOS 常见 Crash 及解决方案
- iOS 常见 Crash 及解决方案
- IOS常见Crash及解决方案
- iOS 常见 Crash 及解决方案
- iOS开发之常见crash
- iOS 常见 Crash 及解决方案
- iOS 常见 Crash 及解决方案
- 真正的软件测试实习3--Android常见的几种crash
- iOS常见crash问题及crash日志分析
- 【leetcode576】Out of Boundary Paths
- html添加文字标注
- Oracle 11.2.0.4 RAC修改VIP(虚拟IP)
- 去除c代码里面的宏定义代码块的程序
- ExtJs window 使用API以及window常用属性和方法
- Android常见CRASH
- Eclipse、Java 历史各个版本下载地址
- Ubuntu服务器环境配置
- 1. LVS
- three.js3D学习(1)
- 【Android C#开发】Xamarin环境搭建
- DNS
- 了解_idt_hook
- 51Nod 1137 矩阵乘法