Android常见崩溃闪退问题的解决方案

背景

Android开发过程中,APP崩溃是一类非常常见的问题,而且APP崩溃问题很多时候对APP安全还是致命性的。APP崩溃大部分是以闪退的形式出现。APP常见的崩溃原因有:NullPointerException 空指针、ClassCastException 类型转换异常、IndexOutOfBoundsException 下标越界异常、ActivityNotFoundException Activity未找到异常、IllegalStateException 非法状态异常、ArrayIndexOutOfBoundsException 数组越界异常、SecurityException 安全异常。下面就详细探索分析App常见崩溃的问题和对应的解决方案。

NullPointerException 空指针

NullPointerException在android开发中经常会碰到这类异常问题,例如引用的对象为空,数组为空等都会引发控制在异常。

数组NullPointerException。

不能向一个空数组元素赋值,获取长度,否则报

NullPointerException: Attempt to write to null array和

NullPointerException Attempt to get length of null array。

以下的数组出现NullPointerException 范例代码,它会触发上面两种空指针异常。

图片

触发NullPointerException 异常的日志信息

图片

空数组元素的赋值异常

Object 对象 NullPointerException

对象空指针,是因为引用一个空对象,进而导致空指针,通常会报以下错误

Attempt to invoke a virtual method on a null object reference,以下代码可能会引起空指针异常。

object对象触发NullPointerException异常的代码

图片

触发NullPointerException 异常日志分析

图片

NullPointerException 解决方案

在代码开发过程中,在使用对象前先进行判断对象是否为空,当对象为空的时候不可使用,只有对象不为空的时候再进行使用。并且通过使用try-catch异常捕获方式将抛出的异常进行捕获处理。

图片

最根本的方法是通过优化代码逻辑,从根本上解决问题

图片

ClassCastException 类型转换异常

这种类型转换异常通常是发生在类型转换时,并且在编译代码期间,编译器不会有报错的提示,但是当运行时,如果存在此异常,可能会导致APP崩溃闪退的情况。

当父类强制转换为子类时,ClassCastException 就会发生类型转换异常

下面的代码,它会引起 ClassCastException异常的出现

图片

异常日志分析

图片

解决方案

通过使用try-catch 进行捕获异常,最主要的还是要从代码上解决根本问题。

图片

IndexOutOfBoundsException 下标越界异常

List 在开发中经常会被用的,那么错误的使用下标,将会导致IndexOutOfBoundsException越界异常。

下面的代码会触发IndexOutOfBoundsException异常

图片

异常日志分析

图片

解决方案

在使用时先进行对对象作判断,判断对象内容是否为0,如果为0的时候那么就不进行使用。

图片

ActivityNotFoundException异常

ActivityNotFoundException的异常,通常出现于Eclipse 开发Android应用中中,Android studio编译器 已经默认自动生成Activity,以及布局文件。

主要原因是未在AndroidMainfest.xml文件中注册,在使用组件 的时候如果未注册,那么就会引起APP crash的情况。

ActivityNotFoundException 代码举例

Activity未在Androidmainfest.xml 中注册会引起ActivityNotFoundException

图片

异常日志分析

图片

ActivityNotFoundException 解决方案

在android中四大组件只有先注册才能正常使用,AndroidManifest.xml中进行注册。

图片

IllegalStateException异常

IllegalStateException它是非法状态异常,是因为在APP应用中代码状态非法导致的。

以下代码会引起IllegalStateException的异常情况,当Button控件声明android:onClick="IllegalStateException" 却未在Java代码中使用时,点击Button,就会出现此类异常。

IllegalStateException 异常范例

图片

异常日志分析如下

图片

解决方案

图片

ArrayIndexOutOfBoundsException 数组越界异常

数组在代码中经常被用到,当适用数组下标不当时,就会出现ArrayIndexOutOfBoundsException。比如数组长度为4,但你要引用下标为5的元素,这时候,就会异常crash。

ArrayIndexOutOfBoundsException 代码举例:

图片

异常日志分析

图片

ArrayIndexOutOfBoundsException解决方案

1、正确使用数组下标

2、如果不确定数组长度,请先获取长度,然后在判断下标是否大于等于数组长度。

3、try-catch 抓住异常,防止crash,但不能从根本上解决问题。

SecurityException 安全异常

SecurityException 安全异常在Android 中也会经常发生,主要是Android 的安全机制原因造成的,为了管理应用获取手机的一些敏感信息,Android安全机制规定,必须在AndroidMainfest.xml 文件中声明,并且,Android 6.0之后,获取手机敏感信息时候,需要动态申请权限,只有用户授权后才可以获取手机敏感信息。

获取手机的IMEI 号属于手机的敏感信息而触发SecurityException异常 

图片

异常日志分析如下

图片

SecurityException 解决方案

Android 6.0之前,在AndroidMainfest.xml中申请权限即可,

Android 6.0 之后,请动态申请权限。

图片

参考借鉴文章

https://www.pianshen.com/article/8495643219/

推荐阅读

NDK POSIX多线程编程

JNI与NDK编程知识基础详解

Android NDK开发之JNI基础篇

JNI与NDK编程常用方法史上最全总结和详解

NDK开发中Native方法的静态注册与动态注册

JNI与NDK编程函数注册与C++调用Java详解

Android Native内存泄漏检测

用Asan提前解决NDK疑难crash

Android NDK开发中快速定位Crash问题

Android NDK开发基础之C语言的内存管理

Native(C++)开发中如何使用ASan检测内存错误

Android高级开发中ANR/Native Crash问题的解决方法

微信公众号

 

图片

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值