Java对接Firestore时ArrayList.add()返回空值问题咨询
关于ArrayList.add()的返回值问题
java.util.ArrayList的add(E e)方法永远不可能返回null。翻JDK源码就能看到该方法的实现逻辑:元素插入成功后固定返回true——ArrayList本身支持重复元素、会自动动态扩容,不存在插入失败返回空的场景。
你观察到的“返回结果为空/无内容”和add方法本身无关,完全是日志写法错误导致的。你用的是SLF4J规范的日志门面,这类日志接口要求通过{}作为参数占位符,没有写占位符时,后续传入的参数会被日志框架直接忽略,根本不会拼接到输出的日志内容里。你写的log.debug("Result is ::",myStringList.add(myString))、log.debug("Arraylist size::", myStringList.size())、log.debug("Arraylist content::", myStringList)全属于这种错误写法,自然看不到对应的输出。甚至你以为成功打印变量值的log.debug("Value of myString", myString)也没真的打印myString的内容,你看到的输出只是固定的"Value of myString"字符串而已。
关于Firestore拉取逻辑的问题
核心的数据拉取逻辑没有本质错误,普通Java服务端项目用ApiFuture.get()同步阻塞获取查询结果是合法写法,但存在两个可修正的问题:
- 异常处理缺失:
apiFutureResults.get()方法会抛出InterruptedException(线程被中断)、ExecutionException(Firestore请求执行失败,比如权限不足、字段不存在、网络错误),当前代码没有做捕获或向上抛出声明,线上运行遇到异常会直接崩溃。 - 无超时保护:无参的
get()方法会无限阻塞等待Firestore返回,如果遇到网络波动、服务端故障,会导致当前线程永久卡死,建议换成带超时参数的重载方法,比如apiFutureResults.get(30, TimeUnit.SECONDS)设置30秒超时。
修正日志写法后你就能看到正常的输出:add方法固定返回true,ArrayList的size、内容都和你插入的字段值一致。Firestore的QueryDocumentSnapshot.getString()返回的就是标准Java String对象,和你自己定义的字符串没有任何区别,不会影响ArrayList的正常操作。
修正后的日志写法参考:
for(QueryDocumentSnapshot document: documents) { String fieldValue = document.getString("myColumnName"); log.debug("直接读取字段值:{}", fieldValue); log.debug("add方法返回值:{}", myStringList.add(fieldValue)); log.debug("ArrayList当前size:{}", myStringList.size()); log.debug("ArrayList当前内容:{}", myStringList); }
内容的提问来源于stack exchange,提问作者aarav

