最近使用了Objectbox作为新项目的数据库后台,Greendao开发团队新力作,但是Objectbox算是比较新的一个东西,现在资料也不多。

今天跟大家分享一个关于Box类的getAll()函数的遇到的一点坑。

我们首先看一下Box类的getAll函数的说明,

java.util.List<T> getAll()
Returns all stored Objects in this Box.

以Lists的形式返回box中的所有对象。

我很自然地加了一个检验是否返回为null的

List<StockInfo> stockInfoList=stockInfoBox.getAll();//getAll函数你要判断是不是一个emptylist
if(stockInfoList!=null)
return stockInfoList;
return new ArrayList<StockInfo>();

结果当表为空的时候,我要往stockInfoList里面添加数据时,程序瞬间崩溃了,其中最关键的log告诉我

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=3, data=Intent { (has extras) }} to activity {com.elliott.zheng.xica/com.elliott.zheng.xica.Activity.MainActivity}: 
java.lang.UnsupportedOperationException at android.app.ActivityThread.deliverResults(ActivityThread.java:3769)

UnsupportedOperationException 也就是由于不支持的操作导致的异常。

经过一番痛苦的调试,查看下列getAll函数源码,发现当box为空时,getAll函数返回的不是null而是Collections.emptyList()

/**
* Returns all stored Objects in this Box.
*/
public List<T> getAll() {
Cursor<T> cursor = getReader();
try {
T first = cursor.first();
if (first == null) {
return Collections.emptyList();
} else {
ArrayList<T> list = new ArrayList<>();
list.add(first);
while (true) {
T next = cursor.next();
if (next != null) {
list.add(next);
} else {
break;
}
}
return list;
}
} finally {
releaseReader(cursor);
}
}

这个东西非常神奇,它的长度为空,不支持add操作,而且它不等于null,所以上面我那个语句判断 stockInfoList!=null 为true而

直接将这个Collection.emptyList()生成的对象直接返回,而当我试图往里面add元素时,程序直接崩溃,因为这个对象不允许进行add()操作,一旦进行添加操作,会直接抛出异常,

说不支持这种操作,导致程序崩溃。

解决办法:判断getAll函数返回值是否等于Collections.EMPTY_LIST(这里判断返回值是否为null,没有用),即

List<StockInfo> stockInfoList=stockInfoBox.getAll();//getAll函数返回值应判断是不是一个emptylist
if(stockInfoList!=Collections.EMPTY_LIST)
return stockInfoList;
return new ArrayList<StockInfo>();

让我疑惑不解的是,在Collections类的定义中,EMPTY_LIST好像就是定义为null啊。。。。,但是将返回值和null比较又不相等。

public static final List EMPTY_LIST = null;

知道的朋友希望能够在评论区指出,如果文章有错误欢迎在评论区讨论,共同进步。

作者: Elliott Zheng

出处: http://www.cnblogs.com/elliottzheng/p/8068055.html>

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(elliott.zheng@foxmail.com)咨询.

Objectbox Box的getAll() 函数返回emptylist() 未判断导致崩溃的更多相关文章

  1. PYTHON-错误-函数有返回值未接收导致替换不成功

    #1.有返回值,没有赋值,替换不成功 cxj = 'guapi' cxj.replace(cxj,'2b') print(cxj) #2.有返回值,赋值,替换成功 cxj = 'guapi' cxj ...

  2. GetLastError()函数返回值及含义

    GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置.函数并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值, ...

  3. string类find函数返回值判定

     string类find函数返回值判定 代码示例 #include<iostream> #include<cstring> using namespace std; int m ...

  4. 2016/05/25 PHP mysql_insert_id() 函数 返回上一步 INSERT 操作产生的 ID

    定义和用法 mysql_insert_id() 函数返回上一步 INSERT 操作产生的 ID. 如果上一查询没有产生 AUTO_INCREMENT 的 ID,则 mysql_insert_id() ...

  5. C++ enable_if 模板特化实例(函数返回值特化、函数参数特化、模板参数特化、模板重载)

    1. enable_if 原理 关于 enable_if 原理这里就不细说了,网上有很多,可以参考如下教程,这里只讲解用法实例,涵盖常规使用全部方法. 文章1 文章2 文章3 1. 所需头文件 #in ...

  6. Python 函数返回值、作用域

    函数返回值 多条return语句: def guess(x): if x > 3: return "> 3" else: return "<= 3&qu ...

  7. 【VS开发】recv函数函数返回值说明(特别有利于工程调试)

    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据. ...

  8. Python3_函数参数传递、可变与不可变对象、变量作用域、函数返回值

    参数传递: 在 python 中,类型属于对象,变量是没有类型的:(变量都仅仅是一个对象的引用,没有类型之分)a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] ...

  9. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

随机推荐

  1. P2913 [USACO08OCT]车轮旋转Wheel Rotation

    传送门 初始状态是 0,如果有 1 的连接,0 就变 1,如果还有 1 的连接,1 就变 0,如果是 0 的连接就不变 所以就是把答案异或上所有连接,不用考虑顺序,反正最终是一样的 #include& ...

  2. nginx配置文件企业优化

    1.1 企业规范优化Nginx配置文件 第一个里程碑:创建扩展目录,生成虚拟主机配置文件 mkdir extra sed -n '10,15p' nginx.conf >extra/www.co ...

  3. linux 网卡配置文件详解2018-03-07

    转自:https://www.cnblogs.com/ienino/p/7717092.html 配置文件位置:/etc/sysconfig/network-scripts/ifcfg-eth0 1. ...

  4. 【ACM】无聊的小明

    无聊的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述       这天小明十分无聊,没有事做,但不甘于无聊的小明聪明的想到一个解决无聊的办法,因为他突然对数的正 ...

  5. PHP artisan

    Artisan 是 Laravel 提供的 CLI(命令行接口),它提供了非常多实用的命令来帮助我们开发 Laravel 应用.前面我们已使用过 Artisan 命令来生成应用的 App Key 和控 ...

  6. mybatis 动态行转列

    SELECT user_name , MAX(CASE course WHEN '数学' THEN score END ) 数学, MAX(CASE course WHEN '语文' THEN sco ...

  7. Tiles框架入门教程

    1.为何选用Tiles 刚接触Java Web开发的人都知道,JSP中可以通过include标签动态插入一个JSP页面.在了解这个功能后可能会兴奋不已,因为这样可以实现多个JSP页面共用一个JSP的内 ...

  8. Django权限1

    1.权限,说白了就是你有资格访问这个网址,而别人每一资格:你有资格进行增删改查,而别人只有查的权限 2.新建是3张表: #用户表 class User(models.Model): name = mo ...

  9. swing线程机制

    在介绍swing线程机制之前,先介绍一些背景概念. 背景概念 同步与异步:     同步是指程序在发起请求后开始处理事件并等待处理的结果或等待请求执行完毕,在此之前程序被阻塞(block)直到请求完成 ...

  10. pat1044. Shopping in Mars (25)

    1044. Shopping in Mars (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Shop ...