Android Studio空指针异常:点击导航订单页面自动崩溃
看起来你遇到了点击导航栏「订单」选项时页面直接关闭的崩溃问题,我从你提供的Logcat日志里找到了核心原因,咱们一步步来解决:
首先先看崩溃的关键日志片段:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.udaya.smartfoodserver, PID: 12671
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.udaya.smartfoodserver.Common.Common.convertCodeToStatus(Common.java:15)
at com.udaya.smartfoodserver.OrderStatus$1.populateViewHolder(OrderStatus.java:54)
这个崩溃的本质是:在Common.java的第15行,你尝试对一个null的字符串对象调用equals()方法,直接触发了空指针异常,导致整个页面进程崩溃。
第一步:定位问题代码
打开你的Common.java文件,找到第15行,你大概率会看到类似这样的代码:
if (statusCode.equals("PENDING")) { // 这里的statusCode就是null的那个对象 return "待处理"; } // 其他状态判断...
这里的statusCode(或者你代码里的变量名)是从订单数据里拿的状态码,但它的值是null,所以调用equals()就炸了。
第二步:修复空指针异常
有两种简单又靠谱的修复方式,选哪种都可以:
- 方式一:先判空再调用equals
在判断前先确保字符串不为null,同时处理null的情况:public static String convertCodeToStatus(String statusCode) { if (statusCode != null && statusCode.equals("PENDING")) { return "待处理"; } else if (statusCode != null && statusCode.equals("COMPLETED")) { return "已完成"; } else { // 如果是null,返回一个默认状态,比如"未知状态" return "未知状态"; } } - 方式二:用常量字符串调用equals(更推荐)
把常量放在equals()的前面,这样就算变量是null也不会崩溃(因为常量肯定不是null):public static String convertCodeToStatus(String statusCode) { if ("PENDING".equals(statusCode)) { return "待处理"; } else if ("COMPLETED".equals(statusCode)) { return "已完成"; } else { return "未知状态"; } }
第三步:排查数据为什么是null
修复完代码后,最好再查一下根源:为什么这个状态码会是null?
- 检查订单数据的来源:如果是接口返回的,看看后端接口是不是没返回这个字段,或者返回了null;如果是本地数据库,看看存储的时候是不是没赋值;
- 可以在调用
convertCodeToStatus的地方(也就是OrderStatus.java第54行)加个日志,确认传入的参数:// 在OrderStatus的populateViewHolder里 String code = order.getStatus(); // 假设是这么拿的状态码 Log.d("OrderDebug", "当前订单状态码:" + code); // 打印出来看是不是null String statusText = Common.convertCodeToStatus(code);
这样处理后,再点击「订单」选项应该就不会崩溃了,页面能正常加载订单数据啦。
内容的提问来源于stack exchange,提问作者user9532828

