Android常见CRASH


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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值