Android常见CRASH
2017-05-11 13:33
1006 查看
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()。 |
相关文章推荐
- Android常见Crash原因
- Android常见Crash类型分析(一)
- Android开发中常见的crash整理
- Android 中的adapter和作用以及常见的adapter
- Eclipse开发Android常见错误及解决办法
- Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读
- Android Crash监测工具Bugly初体验
- Android Notification常见样式总结
- android调试crash——反汇编
- android 应用常见退出方法
- Android开发各类常见错误解决方案
- Android常见开源框架总结
- Android开发使用的常见第三方框架汇总
- Android开发各类常见错误解决方案
- Android WebView常见问题及解决方案汇总
- Android ROM开发(二)——ROM架构以及Updater-Script脚本分析,常见的Status错误解决的方法
- Android常见问题
- Android Crash的log分析(Tombstone)
- Android Crash 全局捕获
- Android 常见度量单位【xdpi、hdpi、mdpi、ldpi】 解读