初学者最常犯的编程错误是什么呢?有可能他们总是混淆等值(==)与赋值(=),或者 & 和 &&;也有可能是他们在循环中使用错误的分隔符(for (int i = 0, i < 5, i++))...?

为了回答这个问题,数据科学家最近检查了来自世界各地25万个Java编程新手的错误。在使用了大量的数据(数据来自3700万的源代码,所以是精确的)之后,他们发现了学生第一次学习Java时最容易犯的错误,以及他们从所犯错误中吸取教训所需要的时间。这个结果非常出人意料。

黑匣子数据采集项目

学习一门新的编程语言是非常具有挑战性的,因为你必须学会怎样用精确的、正规的语法来表达复杂的思想。这样就自然而然的导致许多编程新手犯错误。为了揭露哪些错误是新手最容易犯得,来自英国肯特大学的研究人员在黑匣子数据集里检查了收集自世界各地265000位学生的Java代码。

黑匣子数据采集项目是建立在BlueJ上的,BlueJ是一个专为初学者设计的Java IDE。BlueJ试图减少新手成功的障碍,例如突出代码块的开始和结束(范围突出),它可以帮助学生直观的扫描代码和定位错位的大括号。另一个特点是,对象可以在程序运行时,使得字段的内容可被显示,以便帮助理解和调试。BlueJ提供教科书、教师的支持,而且确实是 RaspbianLinux distribution的一部分。

黑匣子充当BlueJ一个可选择的扩展来收集软件使用情况的各种匿名数据。比如,它跟踪哪些功能被执行,在什么时间遇到什么错误,以及错误出现的频率。

数据集是巨大的。在2013-2014这一个学年,共有37158094个编译事件被收集,其中19476087个是成功的,17682007个是不成功的。

虽然我们大多数人在面对解析如此庞大的数据时会有所畏惧,但是来自英国肯特大学的Amjad Altadmri 和 Neil Brown却无所畏惧。他们检查了卷入3700万编译事件的46,448,212 个源文件中的每一个,并且实时检测变化。他们对每一个可能出错的事件用A-R来分类,并以此建立起来一系列的可能会出现的错误。他们还预测出学生修复完bug的时间。

Java编程中初学者最易犯的10个错误

Altadmri 和 Brown(2014年)惊讶的发现Java专家和教师认为初学者最常犯的错误仅仅是基于传闻的常识性错误。他们认为这是一个危险的信号,因为关于Java的书籍大多都是这些专家和教授编写的,在教材里这些误解会被展示并传播。

因此,如果你研究那些数据,你就会发现一个明确的关于排名前十的错误的清单(从A标记到R的18个错误的研究也包含在这个课题中。)

C.不对称的括号,大括号,括号和引号,或利用这些不同的符号互换,如:while (a == 0]。

I.使用错误的参数或参数类型的调试步骤,如:list.get("abc")。

O.控制流可以达到无需返回的非虚法结束(end of non-voidmethod),如:

  1. public int foo(int x)

  2. {

  3. if (x < 0)

  4. return 0;

  5. x += 1;

  6. }

A.混淆赋值运算符(=)与比较运算符(==),如在:if (a = b)。

N.忽略或丢弃非空类型方法的返回值(the return valueof a method with non-void return type),比如:myObject.toString();。

B.使用==替代.equals比较字符串。

M.试图把非静态方法当成是静态的来调用,如:MyClass.toString();。

R.研究要求实现一个接口,但没有实现所有所需的步骤,如: class Y implementsActionListener { }。

P.当调用一个方法时调用的参数类型,如: myObject.foo(int x,String s);。

E.在if语句或者for以及while循环中使用不正确分号,如: if (a==b); return 6;。

最常见的错误(C),其实是放错地方或者忘记小括号,大括号,括号和引号, BlueJ做的事的是试图中和范围突出(counteract with scope highlighting)。这一发现可能是一个指示,就是C型的错误在IDE中更为普遍,并且不提供任何形式的调试帮助。

出人意料的是,这些错误并没有进入前十:

D.把传统的逻辑运算符(&和|)与短路的写值程序(&&和||)搞混淆。

J.一个方法调用后忘记使用括号,如:myObject.toString;。

Q.在返回路径和不同类型的分配值之间使用不兼容类型,例如: int x =myObject.toString()。

F.在for循环中使用错误的分隔符(用逗号而不是分号),如:for (int i=0, i <6, i++)。

H.使用关键字作为路径或变量名,如:int new;。

学生需要多长时间从自己的错误中吸取教训

此外,当Altadmri 和 Brown观察学生需要多久才能发现并修正错误时发现最常见的C类错误也是最快被发现之一。其他有些错误是出了名的难以发现,而且大多数程序员会被带入一种情绪中。这些错误包括D类错误、B类错误、N类错误。这些不被人注意超过1000秒(在文件变化并且不再追踪后),或者从来没有发现的。

所有错误类型的time-to-fix(以秒为单位)中值显示如下图(来自Altadmri和Brown(2015))。在右上角重叠的两个错误是错误B和N.

转发:China Hadoop Summit的新浪微博

大数据揭示的10个常见JAVA编程错误的更多相关文章

  1. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  2. python常见的编程错误

    常见的编程错误 2.1 试图访问一个未赋值的变量,会产生运行时错误. 2.2 ==,!=, >=和<=这几个运算符的两个符号之间出现空格,会造成语法错误. 2.3 !=,<>, ...

  3. 大数据存储:MongoDB实战指南——常见问题解答

    锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...

  4. 大数据笔记(十三)——常见的NoSQL数据库之HBase数据库(A)

    一.HBase的表结构和体系结构 1.HBase的表结构 把所有的数据存到一张表中.通过牺牲表空间,换取良好的性能. HBase的列以列族的形式存在.每一个列族包括若干列 2.HBase的体系结构 主 ...

  5. 大数据学习(10)—— Hive进阶

    前面提到了Hive的知识点非常零散,我不知道该怎么把这些知识点分类,跟SQL关系没那么大的就放在这一篇吧. Hive Serde 参考Hive Serde Serde是啥 Serde是序列化和反序列化 ...

  6. 易初大数据 2019年10月24日 spss笔记 王庆超

    数据文件的重置结构:横向结构(个案组),纵向结构,不符合分析方法的时候就需要重组,选定变量重组为个案,数据—重构,重构数据向导,选定变量重组为个案,将选定个案重构位变量,转置所有数据,变量组数目,一个 ...

  7. 易初大数据 2019年10月20日 spss习题 王庆超

    一.选择题 1.有关spss数据字典的说法,正确的是:D A.SPSS数据集的数据字典可以复制到其他数据集中 B.SPSS数据集的数据字典是不能复制的 C.SPSS的数据字典可以通过“复制”和“黏贴” ...

  8. 易初大数据——2019年10月17日 王庆超 spss

    开放数据库链接是为解决异构数据库间的数据共享而产生, 现已成为WOSA的主要部分和基于windows环境的一种数据库访问接口和标准ODOC为异构数据库访问提供统一接口,允许应用程序以SOL.为数据存取 ...

  9. 吴裕雄--天生自然 HADOOP大数据分布式处理:安装配置JAVA

    tar -xzvf jdk-8u151-linux-x64.tar.gz -C /usr/local/src sudo vim /etc/profile .编辑/etc/profile # JAVA ...

随机推荐

  1. 运用Unity实现AOP拦截器

    运用Unity实现AOP拦截器[结合异常记录实例] 本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运 ...

  2. Jenkins中关于一些插件的使用

    Jenkins中关于一些插件的使用方法 最近在为公司搭建CI平台过程中,以及在具体项目实施过程中使用过的一些插件的具体用法: 1. ant插件 这个插件可能是我们最为经常使用的,若构建脚本是使用bui ...

  3. AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由)

    AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由) 在AspNetWebApi管线中存在两种类型的消息处理程序(Message Handler) 1.全局消息处理程序,所有的请 ...

  4. Qt在表格中加入控件

    任务:使用QTableWidget动态生成表格,在每行的某两列中加入QComboBox下拉框控件和QPushButton按钮控件 有添加,删除,编辑功能,每行的按钮可以浏览文件夹并选择文件 1.新建一 ...

  5. android:minSdkVersion 之我见

    在 新建一个 android project 时,要求输入 minSdkVersion 这一项,一般我们是指定和我们使用的 SDK 版本相一致的 API Level. 然后,在androidManif ...

  6. linux 网络编程:客户端与服务器通过TCP协议相互通信 + UDP

    1.TCP编程的客户端一般步骤: 1.创建一个socket,用函数socket(): 2.设置socket属性,用函数setsockopt():* 可选: 3.绑定IP地址.端口等信息到socket上 ...

  7. UIColor RGB颜色对照表

     色 彩 RGB  值 对 照 表   color red green blue Hexadecimal triplet example Aliceblue 240 248 255 f0f8ff   ...

  8. 通过Shell脚本读取properties文件中的参数时遇到\r换行符的问题

    今天在编写微服务程序启动脚本的时候,遇到一个比较奇葩的问题,下面给出具体描述: 目标:通过读取maven插件打包时生成的pom.properties文件,获取里面的应用名称和应用版本号,然后拼接得到s ...

  9. windows下使用命令查看端口占用情况

    使用下面的命令查看端口占用情况: 比如查看3000端口的占用情况 netstat -ano|findstr 3000 运行后,结果如下: 可以看到进程号为9692的占用了该端口,使用下面的命令查看是哪 ...

  10. openstack私有云布署实践【8.1 身份认证keystone的API创建(科兴环境)】

    其中一台controller上面加入环境变量,我选kxcontroller1,关注的是endpoint的名称不一样,其它创建的参数与测试环境一致 export OS_TOKEN=venicchina ...