您的位置:首页 > 移动开发 > Android开发

Android Crash Exception 解决方案(持续更新中)

2017-12-27 15:50 330 查看
Crash Exception 在Android 中经常会遇到,那么遇到异常我们该如何解决,本文将举例解决部分Android看法中遇到的异常。

NullPointerException 空指针
ClassCastException 类型转换异常
IndexOutOfBoundsException 下标越界异常
ActivityNotFoundException Activity未找到异常
IllegalStateException 非法状态异常
ArrayIndexOutOfBoundsException 数组越界异常
SecurityException 安全异常

欢迎关注微信公众号:程序员Android

公众号ID:ProgramAndroid

获取更多信息



微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。

我们不发送红包,我们只是红包的搬运工。


1. NullPointerException 空指针

NullPointerException
在开发中经常会碰到,比如引用的对象为空,数组为空等。

数组 NullPointerException

不能向一个
null
数组元素赋值,获取长度,否则报
NullPointerException: Attempt to write to null array

NullPointerException Attempt to get length of null array
,以下代码会引起上面两种空指针异常。


数组NullPointerException 代码举例



NullPointerException 代码举例


数组NullPointerException Log 举例

Log 信息如下
第一次 
NullPointerException
 如下
12-27 17:17:44.627  8839  8839 E AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to get length of null array
12-27 17:17:44.627  8839  8839 E AndroidRuntime:    at com.programandroid.Exception.NullPointerException.ArrayNullPointer(NullPointerException.java:32)


Log 分析如下



数组NullPointerException

第二次
NullPointerException
 如下
12-27 17:23:24.168 11649 11649 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to write to null array
12-27 17:23:24.168 11649 11649 E AndroidRuntime:    at com.programandroid.Exception.NullPointerException.ArrayNullPointer(NullPointerException.java:34)
12-27 17:23:24.168 11649 11649 E AndroidRuntime:    at com.programandroid.Exception.ExceptionActivity.NullPointerException(ExceptionActivity.java:37)


Log 分析如下



null 数组元素赋值异常

Object
 对象 
NullPointerException


对象空指针,是因为引用一个
null
 对象,进而导致空指针,常报以下错误
Attempt to invoke a virtual method on a null object reference
,以下代码可能会引起空指针异常。


object 对象 NullPointerException 代码举例



Object 对象 NullPointerException


object 对象 NullPointerException log 举例

Log 信息如下:
12-27 17:28:22.565 12725 12725 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke a virtual method on a null object reference
12-27 17:28:22.565 12725 12725 E AndroidRuntime:    at com.programandroid.Exception.NullPointerException.ListNullPointer(NullPointerException.java:45)
12-27 17:28:22.565 12725 12725 E AndroidRuntime:    at com.programandroid.Exception.ExceptionActivity.NullPointerException(ExceptionActivity.java:37)


object 对象 NullPointerException Log 分析如下:



Object NullPointerException


NullPointerException 解决方案

使用时多注意判断对象是否为空



使用对象是,最好判断对象是否为空

使用
try-catch
将抛出的异常抓住



try-catch 代码异常,防止app crash

终极解决方案,优化代码逻辑,从根本上解决问题。


2. ClassCastException 类型转换异常

ClassCastException
 类型转换异常:

此异常发生在类型转换时,并且在编译期间,编译器不会提示报错,但是当运行时,如果存在此异常,可能会导致
app
崩溃 
crash


比如当发生以下情况时,类型转换异常就会发生

父类
强制转换为
子类
时,ClassCastException
就会发生


1. 以下代码 会引起 ClassCastException


ClassCastException 代码举例



ClassCastException 类型转换异常举例


ClassCastException Log 举例

ClassCastException
通常会打印以下类似信息
Caused by: java.lang.ClassCastException:
com.programandroid.Exception.ExceptionActivity$
Fruit cannot be cast to com.programandroid.Exception.ExceptionActivity$Apple


ClassCastException Log 分析



ClassCastException log 分析


ClassCastException 解决方案

使用
try-catch
抓住异常,或者从代码上解决根本问题。



使用 try-catch抓住 ClassCastException异常


2. Android 手机 Settings ClassCastException 解决方案

举例是为了更好的解决开发中的异常。比如在开发中,使用 
monkey
 测试
Settings
模块时,报出的 
ClassCastException
Settings
代码比较多,一时也无法看完,此时,
try-catch
 也是一种不错的选择。

比如
monkey
测试某平台代码时,报出以下异常


Settings ClassCastException Log 举例

log 信息如下:
FATAL EXCEPTION: ApplicationsState.Loader
01-05 03:36:56.101  6304  6941 E AndroidRuntime: Process: com.android.settings, PID: 6304
01-05 03:36:56.101  6304  6941 E AndroidRuntime: java.lang.ClassCastException:
com.android.settings.datausage.AppStateDataUsageBridge$DataUsageState
cannot be cast to com.android.settings.notification.NotificationBackend$AppRow

01-05 03:36:56.101  6304  6941 E AndroidRuntime:    at com.android.settings.applications.AppStateNotificationBridge$3.filterApp(AppStateNotificationBridge.java:110)


Settings ClassCastException Log分析



Settings ClassCastException Log1



Settings ClassCastException Log2


Setting crash ClassCastException 解决方案:



try-catch 异常报错的地方



try-catch 异常报错的地方



try-catch 异常报错的地方


3. IndexOutOfBoundsException 下标越界异常

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


IndexOutOfBoundsException 代码举例



IndexOutOfBoundsException 异常举例


IndexOutOfBoundsException Log举例

Log 信息如下:
12-27 17:41:24.231 16891 16891 E AndroidRuntime: Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
12-27 17:41:24.231 16891 16891 E AndroidRuntime:    at java.util.ArrayList.get(ArrayList.java:411)
12-27 17:41:24.231 16891 16891 E AndroidRuntime:    at com.programandroid.Exception.IndexOutOfBoundsException.isAppOnRecent(IndexOutOfBoundsException.java:40)
12-27 17:41:24.231 16891 16891 E AndroidRuntime:    at com.programandroid.Exception.ExceptionActivity.IndexOutOfBoundsException(ExceptionActivity.java:80)


Log 分析如下:



IndexOutOfBoundsException Log分析


IndexOutOfBoundsException 解决方案

在使用时判断对象内容是否为0.



使用判断List 的size是否为0


4. ActivityNotFoundException

ActivityNotFoundException
 常见于
Eclipse
 开发
Android
中,Android
studio 已经帮忙自动生成Activity,以及布局文件。

主要原因是未在
AndroidMainfest.xml
文件中注册,如未注册,会引起
app
crash
 ,
crash log
如下:
ActivityNotFoundException: Unable to find explicit activity
class


ActivityNotFoundException 代码举例

比如以下代码会引起此异常



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


ActivityNotFoundException Log 举例

Log信息如下:
12-27 17:46:05.994 17893 17893 E AndroidRuntime: Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.programandroid/com.programandroid.Test.TestActivity}; have you declared this activity in your AndroidManifest.xml?
12-27 17:46:05.994 17893 17893 E AndroidRuntime:    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1810)


Log 分析如下:



ActivityNotFoundException Log分析


ActivityNotFoundException 解决方案

AndroidMainfest.xml
中注册即可



四大组件一定,一定要在AndroidMainfest.xml 中注册


5. IllegalStateException

IllegalStateException
 非法状态异常,是因为软件中代码状态非法导致的。

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


IllegalStateException 代码举例



IllegalStateException 代码举例


IllegalStateException Log 举例

log信息如下:
12-27 16:07:41.158  1715  1715 E AndroidRuntime: FATAL EXCEPTION: main
12-27 16:07:41.158  1715  1715 E AndroidRuntime: Process: com.programandroid, PID: 1715
12-27 16:07:41.158  1715  1715 E AndroidRuntime: java.lang.IllegalStateException:
Could not find method IllegalStateException(View) in a parent
or ancestor Context for android:onClick attribute defined on view class
android.widget.Button with id 'btn_on_click'
12-27 16:07:41.158  1715  1715 E AndroidRuntime:    at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:4781)
12-27 16:07:41.158  1715  1715 E AndroidRuntime:    at android.view.View$DeclaredOnClickListener.onClick(View.java:4740)


IllegalStateException Log分析如下:



IllegalStateException Log截图


IllegalStateException 解决方案

IllegalStateException
 类异常很多,不同的代码会有不同的解决方案,上述举例解决方案如下



IllegalStateException


6 . ArrayIndexOutOfBoundsException 数组越界异常

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


ArrayIndexOutOfBoundsException 代码举例:



ArrayIndexOutOfBoundsException 代码举例


ArrayIndexOutOfBoundsException Log举例:

Log信息如下:
12-27 17:51:15.420 19185 19185 E AndroidRuntime: Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=5
12-27 17:51:15.420 19185 19185 E AndroidRuntime:    at com.programandroid.Exception.ArrayIndexOutOfBoundsException.ArrayIndexOutOfBounds(ArrayIndexOutOfBoundsException.java:20)
12-27 17:51:15.420 19185 19185 E AndroidRuntime:    at com.programandroid.Exception.ExceptionActivity.ArrayIndexOutOfBoundsException(ExceptionActivity.java:105)
12-27 17:51:15.420 19185 19185 E AndroidRuntime:    ... 11 more


ArrayIndexOutOfBoundsException Log分析如下:



ArrayIndexOutOfBoundsException Log分析


ArrayIndexOutOfBoundsException解决方案

正确使用数组下标

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

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


7. SecurityException 安全异常

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


SecurityException 代码举例

获取手机的IMEI 号属于手机的敏感信息



获取手机IMEI号


SecurityException log举例

12-27 18:05:55.663 21467 21467 E AndroidRuntime: Caused by: java.lang.SecurityException: getDeviceId: Neither user 10117 nor current process has android.permission.READ_PHONE_STATE.
12-27 18:05:55.663 21467 21467 E AndroidRuntime:    at android.os.Parcel.readException(Parcel.java:1683)
12-27 18:05:55.663 21467 21467 E AndroidRuntime:    at android.os.Parcel.readException(Parcel.java:1636)
12-27 18:05:55.663 21467 21467 E AndroidRuntime:    at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:4281)


SecurityException log 分析



SecurityException log 分析


SecurityException 解决方案

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



AndroidMainfest.xml 中申请权限

感谢您的阅读,谢谢!

​欢迎关注微信公众号:程序员Android

公众号ID:ProgramAndroid

获取更多信息



微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。

我们不发送红包,我们只是红包的搬运工。



点击阅读原文,获取更多福利

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: