关闭表格时可能导致NRE的原因是什么?

时间:2013-04-09 16:49:25

标签: c# compact-framework windows-ce nullreferenceexception .net-1.0

在某些情况下,使用Close按钮关闭表单时会得到一个NRE,它只调用本机(WinForms)Close()方法。

通过代码的某些路径可以正常工作,但是一个特定的路径会导致Null引用异常。由于这名义上是一个引用null的东西的情况,当表单被简单关闭时,怎么会发生这种情况呢?我可以想象,或许存在内存泄漏,但是引用了一些我不理解的东西。

代码中可能存在哪些潜在原因?

更新

对Jon Skeet的回答:

我无法以正常方式调试此问题,原因是无聊和费力(再次),但我能做的是:

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
    MessageBox.Show(ex.InnerException.ToString());
    SSCS.ExceptionHandler(ex, "frmEntry.saveDSD");
}

最后一个是内部/自定义异常处理方法。

我从这些方面获得的是:

"Null Reference Exception"
Nothing (empty string)
"Exception: NullReferenceException Location: frmEntry.btnSave.click

请注意,现在显示的最后一个异常暗示btnSave.click是罪魁祸首,而之前它指向saveDSD。 Curiouser和curiouser。这是霍桑效应*的一个案例(好吧,改进的霍桑效应,在某种意义上说,添加这个调试代码可能会改变一些事情)。

  • 规范的霍桑效应更像是这种场景:一群猫正在打篮球。有些女孩走了看。猫开始炫耀和热腾腾,一个人摔断了腿。是女孩子吗?故障?不,如果他们没有看过,会不会发生?否。

更新2

谈论霍桑效应:当我将两个MessageBox.Show()调用复制到frmEntry.btnSave.click的catch块时,我得到了:

"Null Reference Exception"
"Null Reference Exception"
"Exception: NullReferenceException Location: frmEntry.Closing"

以下,NRE的位置一直在移动,就像乡村公路上的一只松鼠,当[h,sh] e遇到两辆相反方向的汽车时。

更新3

它又一次发生了:将这些MessageBox.Show()添加到表单的Closing事件会导致NRE弹出一个不同的洞并声明自己。这个近亲代码正在通过分数产生(或克隆)半智能,或者看起来如此。

更新4

如果编写不良代码是犯罪行为,编写此内容的猫应该在SuperMax中单独监禁。

这是最新的恶作剧者/咆哮者:

int cancelled = ListRecords.cancelled;
if (cancelled == 0)
. . .

公众"取消" ListRecords的成员(在另一个类中)只被赋予0和1的值。因此,不仅像bool一样取消了声音,它也像bool一样。为什么它不是宣布作为bool?!?!?

此代码库的官方形象应该是Edvard Munch" The Scream"

更新5

也许我正在发泄,但最近的经历使我为某些类型的代码提出了新名称,并为许多项目提供了说明。代码不会去任何地方,但只是占用空间(作出的任务,但后来没有采取行动,或称为空方法/处理程序)我现在称之为#34;温彻斯特神秘屋代码。&#34; < / p>

对于典型的项目(我现在已经成为了#34;员工以及现在许多项目的承包商,拥有近20年的编程经验),我现在将情况比作一群人在流沙中徘徊。当他们雇用新人来到船上时,&#34;他们真的希望他们和他们一起跳进流沙。这对事情有什么帮助?这只是一个案例&#34;痛苦爱公司&#34;?他们应该做的是说&#34;给我们一根绳子!&#34;不是&#34;来吧,流沙很好!&#34;

很多时候,它可能只是熵和工作安全&#34;正在上映;如果他们继续与他们选择或创造的怪物搏斗,他们来之不易的知识如何保持野兽或多或少,将使他们处于半舒适的工作中。如果他们做出任何根本性的改变(大多数团队需要做出一些根本改进,IMO),这可能会危及他们的就业状况。也许答案是聘用/签约&#34;过渡团队&#34;将团队/公司从史前恐龙俱乐部时代转移到21世纪,培养“老守卫”#34;这样他们就可以保住自己的工作。毕竟,这些&#34;救世主&#34;还不够。窃取旧手&#39;无论如何工作 - 培养他们,让他们加快速度,继续前进。一切都会受益。但许多人似乎更愿意继续沉溺于泥潭或流沙中。

在任何人雇用程序员之前,他们应该至少给他们一个测试,通过测试将证明他们至少熟悉Steve McConnell&#34; Code Complete中描述的基本原则。 #34;

好的,回到战斗流沙......

更新6

或者:&#34;重构Spo-dee-o-dee&#34;:

A&#34;陷阱&#34;如果你改变一个变量的名称,那就是重构:

ChangeListType chgLst; // ChangeListType is an enum

......对此:

ChangeListType changeListType;

...如果有一个名为&#34; chgLst&#34;的列的数据表,SQL语句也会被更改,如果不是你的一天,它可能会破坏至少部分。

另一个可能的问题是,当你得到时,&#34; [var name]只被分配,但它的值从未使用过&#34;提示。你可能认为你可以只是骑自行车所有这些,但要注意你可能注释掉的任何相关代码以及对这些死亡变量的赋值都不会产生依赖的副作用。不可否认,这将是一种不好的编码方式(将有效方法存储在被忽略的变量中的副作用方法),但是......它会发生,尤其是当原始编码器是螺旋桨头疯狂的科学家牛仔时。

这段代码充满了反模式,如果Butterick和/或Simplicity与这个人签订合同,我不会感到惊讶。

第二个想法,除了这个项目的架构,设计,编码和格式之外,它并不是真的所有那么糟糕......

Mary Shelley&#34; Frankenstein&#34;确实非常有先见之明,但并不像大多数人所想的那样。它不是对技术运行的一般预感,而是比这更具体:它是大多数现代软件项目的预告,其中包括部分和#34;从这里开始,无所事事地卡在一起,几乎没有考虑到髋骨是否与大腿骨连在一起&#34; (或应该)以及这些部分是否匹配或相互拒绝;左手并不知道右边做了什么,而魔鬼则是最后的!等

1 个答案:

答案 0 :(得分:1)

在任何这些情况下都可能发生这种情况:

  • 对象obj null,您的代码为obj.ToString()
  • 字符串项null,您的代码为item.Trim()
  • 设置mySettings null,您的代码为mySettings.Path

不太常见的事情是发布信息的线程或在SerialDataReceivedEventHandler被删除后尝试接收数据的串口。

查看您的可疑表单的代码和父表单的代码正在处理关闭此可疑表单的时间以及可疑表单上可能运行的其他进程。