最近使用了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. CF D. Fair(思维+DFS)

    http://codeforces.com/contest/987/problem/D 题目大概: 给出一个n个城镇m条边的图,给出每个城镇拥有的特产(可能多个城镇有相同特产).有k种不同特产. 要求 ...

  2. Vue 中怎么发起请求(一)

    1.vue 支持开发者引入 jquery 使用 $.ajax() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1.首先,在 package.json 中添加 j ...

  3. STL 部分学习 未整理

    https://www.cnblogs.com/pugang/archive/2012/02/10/2345942.html

  4. 大型分布式java应用与SOA

    1.基于消息方式.远程调用方式的架构带来的问题: 1.1 系统多元化的问题 [解决]: 对共用逻辑部分进行抽象: 1.2 系统访问量.数据量上涨后带来的问题 [解决]: 拆分系统: 1.3 在构建共用 ...

  5. 加解密---Java安全

    一.概述 1.JCA(Java Cryptography Architecture) 提供基本的加密框架(消息摘要.数字签名......) 2.JCE(Java Cryptography Extens ...

  6. git知识点总结

    集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器.集中式版本控制系统最大的 ...

  7. thinkphp3.2 删除Runtime目录里的缓存文件,标记一下,以下好找。

    操作如下: utility::clearCache("Data"); 或 utility::clearCache("Data-Logs"); class uti ...

  8. (转)stty 命令说明及使用讲解

    stty 命令说明及使用讲解     UNIX系统的命令很多,但是巧妙使用命令的方法更多.随着经验的积累和观察学习其他用户的实践,我们也可学会解决特殊问题的方法.这里谈谈自己使用UNIX系统中stty ...

  9. .NET标准化题目

    1. 下面对FxCop的描述中,错误的是:(D) A. FxCop是一个静态代码分析工具. B. 可以定制自己的规则加入FxCop引擎. C. FxCop主要是对.NET中托管代码的assembly进 ...

  10. MVC视图之间调用方法总结

    调用视图方式有两种: 一:直接调用(不通过controller) <body> @Html.Partial("../Shared/Error"); </body& ...