一个数组引发的“灾难”

国庆后上班,领导要求给一个模块写一个PC测试软件,功能要求很简单,读取配置文件,然后根据文件中的数据对模块进行依次定时查询/设置,加上测试用了三天时间(注:用本人电脑做的测试),最后是发给同事,但在他的电脑都无法运行,双击软件没有任何反应。

  需要说明一下:我的电脑是32位的win8系统,64位win7系统

           软件我使用32位的VS2010编写的,.net framework是4.0的

  看到这个情况,我首先想到的是同事的电脑没有 .net framework 4.0,但是根据以往的经验,如果.net framework 版本不够或者没有安装.net framework,运行软件的话,都会有对话框提示的,但这次没有,为了排除这个问题,我在另外一个同事(32位 xp 系统)的电脑上安装了.net framework 4.0 ,然后运行该软件,依然没有任何界面或者提示框出现。既然不是运行环境的问题,第二个想到的就是操作系统,但是C#默认的目标平台是“Any CPU”,按道理,这个软件对于32位和64位系统都应该能运行的,为了以防万一,我做了两个软件,1---生成 目标平台为"X86"的软件,2---生成一个目标平台为“X64”的软件,可是这两个软件无论是在32位的系统中还是在64位的系统中都无法运行。

  但是以前的其他软件却可以运行,单单这次就不行。而以前的软件的目标框架是.net framework 2.0 或者 .net framework 3.5,会不会是这次用的.net framework 4.0太高了?并且.net framework 4.0 只能在win8以上的系统中才能用?带着这个疑问,我将这个测试软件的目标框架改为.net framework 3.5,不能运行,改为.net framework 2.0还是不能运行。正是奇怪,就这样,陷入了僵局,没了头绪,google/百度都没结果。黔驴技穷,只能用笨方法了---用以前的软件改,用以前软件的解决方案,改里面的代码,这样总不存在框架问题了吧,界面改动下,代码复制一下(代码不涉及到运行环境问题,仅仅是数据处理和逻辑判断),很快就改完了,这次总可以交差了吧,心中美美的想着,发给同事,还是不能运行。

  疯了,彻底被击败了。看来问题应该出现在代码中,可是调试没有问题,在我电脑中运行也没出现异常。被击败了,可是问题还是得解决啊,把同事的电脑接过来,还是在以前的软件上改,但这次不一样,改一部分,就在同事的电脑上运行一下,这样应该就可以确定问题了吧。通过这个方法终于找到问题的根源了:

    string[] ports = SerialPort.GetPortNames();
    serialPort1.PortName = ports[0].Trim();

 明眼人一看应该知道是什么问题了吧!其实,当确定是这两行代码搞得鬼的时候,我也知道是什么问题了。在这个软件的另外一个地方也有这两行代码,但稍有不同:

    string[] ports = SerialPort.GetPortNames();
    comboBox_portname.Items.AddRange(ports);

    if (string.IsNullOrEmpty(wm.serialPort1.PortName))
    {
            if (comboBox_portname.Items.Count > 0)
            {
                    comboBox_portname.SelectedIndex = 0;
            }
    }
    else
    {
            comboBox_portname.Text = wm.serialPort1.PortName;
    }

  对比这两段代码,问题就更明显了吧。

总结下:问题就是没有对ports这个string 数组的长度进行调用前的判断。

    而为什么在我的电脑上可以运行,在其他人的电脑上就不行呢?那是因为在没有接串口线的情况下,我的电脑也会有一个COM口,其他人的电脑在没有接串口线的情况下,是没有COM口的。

    其实,还有一种方法可以很快的找到问题,那就是 try{}catch{},可能是人为这个测试软件太简单了吧,在异常处理上没有像其他软件那样做的很细致,这也是一个问题,而且是一个很严肃的问题,故借此文诫勉自己!

 

  

时间: 2024-11-03 21:48:59

一个数组引发的“灾难”的相关文章

一个TouchableOpacity引发的灾难

今天碰见一个从来没见过的bug,很古怪也很有意思,特意记录下来. 代码如下 <View style={{width:280,flexWrap:'wrap',flexDirection:'row',marginRight:50,}}> { rowData.picurl1!=''&&rowData.picurl1.indexOf('/')==0? <TouchableOpacity onPress={this.openModal.bind(this, true,1,rowDa

div里面的元素垂直均匀分布 按钮引发地址栏出现问号 判断一个数组是否为空 div底部居中 路由传参接受参数

一个固定高度的div的子元素 在垂直 方向上平均分布 .important-dec{ height: 121px; flex-direction: column; display: flex; justify-content: space-between; } 动态计算元素的宽 除了支持 - 还有 + % *width: calc(100% - 210px); 点击element-ui中按钮,地址栏出现问号 是因为按钮的默认事件引发的 阻止它的默认事件就好了2.使用@click.prevent

PHP 中一个 False 引发的问题,差点让公司损失一百万

PHP 中一个 False 引发的问题,差点让公司损失一百万 一.场景描述 上周我一个在金融公司的同学,他在线上写一个 Bug,差点造成公司损失百万.幸好他及时发现了这个问题并修复了.这是一个由 PHP 中的 empty 引发的问题.他使用 empty 函数判断值为 False 的参数.按照他的正常逻辑理解,下面这段代码会输出 Yes.但是,结果却是相反的. $arr['is_default'] = false; if (!empty($arr['is_default'])) { echo "Y

java实现求一个数组里最大值和最小值之前缺省的数的算法

问题描述: 求一个数组里最大值和最小值之间缺省的数,例如 int arrDemo = {1, 3, 7};  那么就要输出最小值1和最大值7之间缺少的数字2,4,5,6 代码如下,有更好的思路欢迎大家在评论区留言讨论 1 package test; 2 3 public class Test { 4 5 static int[] array = { 6 -10,0,3,3,9 7 }; 8 9 private static void printEmptyItems(int[] array) {

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

js实现随机选取[10,100)中的10个整数,存入一个数组,并排序。 另考虑(10,100]和[10,100]两种情况。

1.js实现随机选取[10,100)中的10个整数,存入一个数组,并排序. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <script type="text/java

查找一个数组中超过一半的元素

程序1.0 思想:现将数组排序,再找出元素 void Arraysort(int *a, int length)//冒泡O(n^2) { for (size_t i = 0; i < length; i++) { for (size_t j = 1; j <length - 1 - i; j++) { if (a[j]>a[j + 1]) swap(a[j], a[j + 1]); } } } int MorethanHalfNumber(int *a, int length) { Ar

delphi 判断一个数组的长度用 Length 还是 SizeOf ?

判断一个数组的长度用 Length 还是 SizeOf ?最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是一个字节, 这样用看不出错误, 譬如:  -------------------------------------------------------------------------------- vararr1: array[0..9] of Char;arr2: array[0..9] o