文章内容:最近使用LeapMotion进行软件开发时,使用到了java API---->List集合,使用过程中遇到了一些小bug,特写此博客记录相关心得。

程序编写背景:使用leapMotion提供的Frame类中的deserialize()函数将byte[]数组值反序列化成Frame对象,并存放至List<Frame>集合中。具体代码参见LeapMotionFrameFileOperation.java中的readFile()函数

javaAPI--->List相关:这个程序中使用到了List<Frame> 集合,下面是从整个程序中抽离出的和List相关的代码部分

。。。List<Frame> frames=new LinkedList<Frame>();//用于存储从文件中序列化数据解析出来的Frame对象
。
。
。
Frame newFrame = new Frame();
System.out.println("下面进行反序列化...");
newFrame.deserialize(frameData);
frames.add(newFrame);
。
。
。
return frames;

bug调试:最开始时,代码中是这样写的

      List<Frame> frames=null;      这种情况下,执行到      frames.add(newFrame);时就会抛出如下异常,
Exception in thread "main" java.lang.NullPointerExceptionat LeapMotionFrameFileOperation.readFile(LeapMotionFrameFileOperation.java:190)at DisplayFileData.main(DisplayFileData.java:26)

     为了修复上述bug,将代码改为

      List<Frame> frames=new LinkedList<Frame>();//当然,这里不只这一种改法,可以使用List接口的任何一个实现类的构造函数来初始化List

     修改之后bug便不存在了。

附录:LeapMotionFrameFileOperation.java中的readFile()函数

/
     * @function read the frame data from the saved file* @编程思路 *         To read the frame data from the saved file,*      you can then read the first 4 bytes of the file to determine*       how much data to read to get an entire frame. *         Simply repeat the process until you reach the end of the file.* @param path:String 待读取文件的绝对路径   如d:/LeapMotionData/FrameData/gesture1.txt * @throws IOException */@SuppressWarnings("null")public List<Frame> readFile(String path) throws IOException{System.out.println("进入readFile()函数内部");List<Frame> frames=new LinkedList<Frame>();//用于存储从文件中序列化数据解析出来的Frame对象File file=new File(path);if(!file.exists()&&file.isFile()){System.out.println("相应的文件并不存在,请检查您给出的文件路径是否正确:"+path);return null;}else{//也就是相应文件一定存在的情况下System.out.println(path+"文件是存在的,下面准备对其进行反序列化...");Path filePath=Paths.get(path);byte[] data=Files.readAllBytes(filePath);//将文件中数据一次性读出到一个byte数组中,当文件过大时,要注意内存溢出问题System.out.println("将上述文件中的内容全部读出,并存放在一个byte[]数组中,数组长度="+data.length);System.out.print("byte[] data="+data+"\n");int c=0;//data:byte[]的数组下标,相当于文件指针的当前位置int f=0;int nextBlockSize=0;//表示接下来一帧数据的长度(单位为byte)if(data.length>4){//获得初始的serializedFrame.length:int/*原本存储序列化后的Frame数据时,为了将来进行反序列化也存储了每个序列化Frame数据帧的数据长度(单位为byte)* 序列化帧数据长度是一个4 byte 的int值* 所以反序列化时就要读取4 byte的二进制值,然后使用下面的方法将其转换成十进制数字*/nextBlockSize=(data[c++] & 0x000000ff) << 24 |(data[c++] & 0x000000ff) << 16 |(data[c++] & 0x000000ff) <<  8 |(data[c++] & 0x000000ff);System.out.println("nextBlockSize="+nextBlockSize+"\tc="+c);}while (c + nextBlockSize <= data.length){byte[] frameData = Arrays.copyOfRange(data, c, c + nextBlockSize);//取出一帧数据System.out.println("frameData:byte[]   length="+frameData.length);c += nextBlockSize;//使得数组下标编程下一帧数据  数据长度  位置Frame newFrame = new Frame();System.out.println("下面进行反序列化...");newFrame.deserialize(frameData);//反序列化,有byte数组形式数据转化成Frame ObjectSystem.out.println("反序列化成功,获得一个Frame对象,frame.isvalid()="+newFrame.isValid());this.diaplayFrameInfo(newFrame);System.out.println("将上述Frame对象存放到List<Frame>集合中..\nlist.size="+frames.size());boolean flag=frames.add(newFrame);//将反序列化所得Frame对象添加到List<Frame>中System.out.println("上述Frame对象已经被添加到List<Frame> frames集合中?"+flag+",frames.size="+frames.size());if(data.length - c > 4){nextBlockSize = (data[c++] & 0x000000ff) << 24 |(data[c++] & 0x000000ff) << 16 |(data[c++] & 0x000000ff) <<  8 |(data[c++] & 0x000000ff);  }}//end while}//end if..else..    return frames;}//end readFile()

转载于:https://www.cnblogs.com/lxrm/p/6110330.html

java基础----集合操作---实例----List集合的初始化相关推荐

  1. Java基础知识之什么是集合框架

    Java基础知识之什么是集合框架,前面的文章,我们已经学习了Java的一些基础知识,比如泛型.注解等等内容,接着本博客继续学习Java中一个很常见的内容,集合. 1.什么是Java中的集合框架? Ja ...

  2. Java基础笔记-十五、集合类库(下)

    泛型机制(熟悉) 通常情况下集合中可以存放不同类型的对象,是因为将所有对象都看做Object类型放入的,因此从集合中取出元素时也是Object类型,为了表达该元素真实的数据类型,则需要强制类型转换,而 ...

  3. 夯实Java基础(十九)——集合

    1.前言 集合在Java中的地位想必大家都知道,不用多BB了.无论是在我们现在的学习中还是在今后的工作中,集合这样一个大家族都无处不在,无处不用.在前面讲到的数组也是一个小的容器,但是数组不是面向对象 ...

  4. Java基础知识 21(Set集合,HashSet集合以及它的三种遍历方式(迭代器,增强for循环,forEach),LinkedHashSet集合,TreeSet集合(自然排序法,比较器排序法))

    Java基础知识 21 Set集合 Set集合:一个不包含重复元素的Collection集合,元素不重复,List集合是允许元素重复的. Set接口的三个字类:HashSet(),LinkedHash ...

  5. 【学习笔记】Java基础知识点——第7章·集合

    第7章  集合 7.1  Java集合框架 数组其实就是一个集合.集合实际上就是一个容器,是一个对象,可以来容纳其它类型的数据. 集合不能直接存储基本数据类型,另外集合也不能直接存储Java对象,集合 ...

  6. Java基础---类变量和实例变量

    类变量和实例变量 成员变量:把类内.方法体外的变量称为成员变量. package com.chen.offer.BiliBili;/*** @author chenshimiao* @Email 16 ...

  7. Java基础知识融合(Arraylist集合,多态,继承,封装,包装类,循环嵌套,if嵌套等等)

    目录 1.项目大纲 1.项目前提 2.项目说明 3.项目内容 3.该软件完成以下功能: 2.软件设计 1.结构 2.类设计 3. 部分代码展示 心得: 1.项目大纲 1.项目前提 掌握java基本语法 ...

  8. 【Java基础16】不可变集合、Stream流和异常

    目录 1. 不可变集合 1.1 创建 2. Stream流 2.1 Stream流的创建 2.1.1 获得Stream流 2.1.2 中间操作 2.1.3 终结方法 2.1.4 Stream流数据收集 ...

  9. java 数组操作_9个java数组常用操作实例

    数组的特点: 数组是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来唯一确定数组中的元素.根据数组的维度,可以将其分为一维数组.二 ...

最新文章

  1. 倒计时7天!博客之星虚位以待,Macbook等你来拿
  2. BP神经网络 语音信号分类
  3. 如果QQ秀和拍拍(易迅)深度合作,会有哪些化学反应?
  4. fileinputstream resources 读取文件_压缩20M文件从30秒到1秒,包教包会
  5. 从EMD、WMD到WRD:文本向量序列的相似度计算
  6. 关于android开发环境的创建
  7. A Star寻路相关资料汇总
  8. FFMPEG 图像拉伸缩放及数据格式转换
  9. WSL1 升级为 WSL2
  10. matlab绘制球面点,我需要在MATLAB的笛卡尔坐标中绘制球面方程的帮助
  11. yum如何卸载mysql_linux下 yum 安装mysql和卸载
  12. tablayout 动态改变标题_描点法画函数图像的动态演示——动态数学软件GeoGebra制作教程...
  13. 为什么我们需要再给 Firefox 一次机会?
  14. zen of python什么意思_Zen of Python
  15. mysql查看授权_mysql查看用户授权信息的具体方法
  16. 用Markdown做日记和任务跟踪的DailyNotes
  17. c语言水表程序流程图,水表检定操作流程图.pdf
  18. 什么样的文案才算是好文案?
  19. 多视图聚类方向:子空间学习
  20. win10重装系统修改信息

热门文章

  1. English Through Movie
  2. 排序算法_HeapSort
  3. Android无界面编程之使用Service
  4. 【ms access】SQL 引用外部表
  5. VML编程之------oval圆rect矩型《VML极道教程》原著:沐缘华
  6. yolo之---非极大值抑制
  7. itertools编程训练
  8. ubuntu16.04 运行dso问题梳理
  9. cad图纸怎么看懂_CAD图纸太大,打开的时候很卡怎么办?教你如何给图纸瘦身
  10. java 有意思面试题_一些JAVA中有趣的面试题