最近使用了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. SQL Server中,varchar和nvarchar如何选择

    正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时, 在SQL Server存储中文字符为varchar就会出现乱码(显示为??). ...

  2. c# mvc会话过期设置

    configuration 元素(常规设置架构)   system.web 元素(ASP.NET 设置架构)     sessionState 元素(ASP.NET 设置架构) <session ...

  3. 封装OkHttp,通过改造Callback接口实现

    1:实现Callback回调接口import android.os.Handler;import android.os.Looper;import android.os.Message; import ...

  4. Linux中apache服务

    httpd访问控制生成共享文件vim var/www/html/cq/index.html编辑配置文件 vim /etc/httpd/conf/httpd.conf<Directory &quo ...

  5. python模块之HTMLParser简介

    html.parser是一个非常简单和实用的库,它的核心是HTMLParser类. 工作的流程是:当你feed给它一个类似HTML格式的字符串时,它会调用goahead方法向前迭代各个标签,并调用对应 ...

  6. Linux学习grep,sed,awk工具的使用

    1.grep:根据模式搜索文本并将符合模式的文本显示出来(pattern模式:由文本字符和正则表达式元字符所匹配出来的条件) 注:alias grep='grep --color' -c:打印符合要求 ...

  7. my.ZC

    1.100级,裸身,满技能,属性模拟 数据:   大唐 方寸 化生 龙宫 普陀 地府 狮驼 魔王   气血 1200 1900 2600 1200 2600 2600 1900 1900   魔法 7 ...

  8. hadoop 常用hdfs命令

  9. [转]分享20佳好玩的 jQuery 游戏

    本文转自:http://www.cnblogs.com/lhb25/archive/2011/04/17/2001089.html jQuery是时下最流行的 JavaScript 库.现在,除了HT ...

  10. SQL Server和ASP.NET的操作基本操作

    ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据库: 第二,建立SqlCommand对象,负责SQL语句的执行和存储过程的调用: 第三 ...