Firebase云消息接收时可选参数引发异常问题求助
排查并修复FCM onMessageReceived方法中的空指针异常
看起来你的代码里存在**两个可能触发空指针异常(NullPointerException)**的风险点,这大概率就是你执行时遇到异常的根源,我来帮你拆解并修复:
问题1:未检查"To"字段存在性就直接调用toString()
你直接写了:
String toTel = remoteMessage.getData().get("To").toString();
如果推送的消息数据里没有"To"这个键,remoteMessage.getData().get("To")会返回null,此时调用toString()会立刻抛出空指针异常——因为你不能对null对象调用任何方法。
问题2:"Pic"字段的处理可以更严谨
虽然你判断了remoteMessage.getData().get("Pic") != null,但重复调用get("Pic")有点冗余,而且如果返回的Object不是字符串类型(虽然FCM数据通常是字符串,但严谨性很重要),直接toString也存在潜在风险。
修复后的代码示例
我调整了代码,加入了安全的空值处理,同时优化了代码可读性:
public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); // 安全获取"To"字段:先判断是否存在,再转换为字符串 String toTel = null; Object toObj = remoteMessage.getData().get("To"); if (toObj != null) { toTel = toObj.toString(); } // 简化Pic字段的获取逻辑,避免重复调用get方法 String picUrl = null; Object picObj = remoteMessage.getData().get("Pic"); if (picObj != null) { picUrl = picObj.toString(); } // 后续可根据toTel和picUrl是否为null做对应业务处理 } }
额外优化建议
如果使用Java 8及以上版本,还可以用Optional简化空值判断,让代码更简洁优雅:
String toTel = Optional.ofNullable(remoteMessage.getData().get("To")) .map(Object::toString) .orElse(null); String picUrl = Optional.ofNullable(remoteMessage.getData().get("Pic")) .map(Object::toString) .orElse(null);
这样不管字段是否存在,都不会抛出空指针异常,能完美适配FCM可选参数的场景。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

