一、空指针异常

    private String str;        private void initView() {        int a = str.length();        Log.e("zpan","=========" + a);    }
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()'             on a null object reference            at com.example.zpdemo.activity.ZpYaoActivity.initView(ZpYaoActivity.java:28)

报空指针异常肯定是“.”前面的某个变量为空。这个比较容易排查。

空指针是Crash最常见的一种也是最容易被忽略的一种,后台返回数据为空的场景,防不胜防,只要是有可能为空的数据,最好在使用之前做一次判空处理,以减少崩溃的概率;还有代码执行顺序的场景,还没赋值就拿去用,肯定会报空指针等等。

方案:做好防护工作,逻辑梳理清晰来减少崩溃的发生。

二、类型转换异常

String str = "";int a = Integer.valueOf(str);
 Caused by: java.lang.NumberFormatException: Invalid int: ""            at java.lang.Integer.invalidInt(Integer.java:138)            at java.lang.Integer.parseInt(Integer.java:358)            at java.lang.Integer.parseInt(Integer.java:334)            at java.lang.Integer.valueOf(Integer.java:525)            at com.example.zpdemo.activity.ZpYaoActivity.initView(ZpYaoActivity.java:26)

有时候我们是需要针对 API 传的数据进行类型转换,那我们就不能保证 API 传的数据不为空,如果忽略了这种场景,那等待我们的就是 Crash。

方案:针对类型转换写一个类型安全转换的函数,即返回数据为空的时候,返回默认值。

    private void initView() {        String str = "";        int a = String2Int(str, 0);        Log.e("zpan","=========" + a);    }    private int String2Int(String str, int defaulValue) {        if (TextUtils.isEmpty(str)) {            return defaulValue;        }        try {            return Integer.valueOf(str);        } catch (Exception e) {            return defaulValue;        }    }

将该函数放在 Utils 类中,以便复用。同理,long、double、String等类型的转化,都可以这样防护,减少崩溃。

三、下标越界

    private String str = "abc";    private void initView() {        String a = str.substring(3,6);        Log.e("zpan","=========" + a);    }
Caused by: java.lang.StringIndexOutOfBoundsException: length=3; regionStart=3; regionLength=3           at java.lang.String.startEndAndLength(String.java:298)           at java.lang.String.substring(String.java:1087)           at com.example.zpdemo.activity.ZpYaoActivity.initView(ZpYaoActivity.java:28)

取值超过本身的长度的时候,就会报下标越界异常。API传数据的时候,并且要对字符串做二次处理,这个时候就要考虑字符串取值是否会越界的场景。不仅是字符串,数组和集合同理,也要考虑这种场景。

方案:对可能会出现这种场景的数据,做数据防护。

 

 

更多相关文章

  1. Android(安卓)ScrollView里嵌套ListView
  2. android保存数据到xml以及pull解析模板
  3. android读取SD卡下面所有的TXT文件名,listView显示出来。
  4. RxJava在Android的应用场景
  5. Android(安卓)判断数据库中是否存在某个表
  6. Android之SQLiteDatabase使用与特殊情况处理
  7. Android(安卓)存储文件数据与读出文件数据
  8. android 以httpclient方式把数据提交到服务器
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. android Monkeyrunner:Python语法知识学
  2. Android(安卓)近百个项目的源代码,覆盖And
  3. 为android-support-v4.jar打包源码
  4. TextView添加Onclick点击无效没反应解决
  5. Delphi XE5 android 黑屏的临时解决办法
  6. Android(安卓)Intent 常见用法总结
  7. android中自定义Theme以及TitleBar
  8. Android中pm命令用法详解
  9. Android(安卓)拖拽
  10. Android(安卓)Wifi模块分析(二)