给产品经理讲技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

程序中的“越界”是什么

我们先来介绍一下“数组越界”。数组越界和空指针都属于异常,这两种异常都是 Bug界的“不死鸟”。发生数组越界的原因很简单,假设一个列表中只有10个元素,但是某个函数偏偏要取列表的第11个元素,就会产生异常。原因是程序运行时线程很多,它们都能对同一个数组进行操作,有的往数组里添加数据,有的从数组里删除数据,有的还在循环遍历数组。如果有个数组的长度是11,一个函数在循环遍历数组时下达了从第1个元素遍历到第11个元素的命令,另一个线程却在这个过程中横插一脚,删除了一个元素,而前一个函数在执行遍历的过程中也不知道数组长度发生了改变,于是执行遍历到第11个元素时,自然就发生了数组越界的异常。由于线程执行顺序的问题,这种异常很容易被隐藏。

再来介绍一下“数据范围越界”。计算机分配了很多基本数据类型(如byte、int、float、long、double等)用来表示数字,它们有各自的表示范围,各自占用的存储空间的大小也不尽相同。如果程序员在开发时能确保自己的数字的表示范围,则尽可能使用占存储空间少的数据类型,像1、2、3这样的整型数据可以用int表示,如果能确保存储的数据的数值都很小,那么用byte要比用int表示更省存储空间。程序员要存储的数字超过了他选用的数据类型所能表示的最大范围时,就会发生数据范围越界。程序员确实知道基本数据类型能够表示的范围,但是,很多时候,虽然开始定义时的数据类型选用没有问题,一旦数据经过各种运算处理,就很容易出现问题。比如原始数据在int的表示范围内,经过运算后超过了int的表示范围,但程序员还是在用int接收返回的运算结果。还有一种情况是随着时间的推移,原来定义的基本数据类型范围不够用了。举例来说,产品经理和程序员约定通过后台下发的数字来统计来源信息,一般程序员会选择用int来表示,可产品经理并没有数据表示范围的概念,就按照自己定义的表示规则进行数据配置(如100200300400500),导致存储的数字超过了int的表示范围。