C# 关闭表单时,什么可能导致NRE?

C# 关闭表单时,什么可能导致NRE?,c#,compact-framework,windows-ce,nullreferenceexception,.net-1.0,C#,Compact Framework,Windows Ce,Nullreferenceexception,.net 1.0,在某些情况下,当使用窗体的Close按钮关闭窗体时,我会得到一个NRE,该按钮只调用本机(WinForms)Close()方法 代码中的某些路径可以正常运行,但一个特定路径会导致Null引用异常。既然这名义上是一个引用空值的场景,那么当表单只是被关闭时怎么会发生这种情况呢?我可以想象可能存在内存泄漏,但我不理解引用的是null 代码中可能存在哪些潜在原因 更新 对Jon Skeet的答复: 我无法以正常的方式调试它,原因是(再次)令人厌烦和费劲,但我能做的是: catch (Exception

在某些情况下,当使用窗体的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。好奇者和好奇者。这是霍桑效应的一个例子吗*(好吧,一个修改过的霍桑效应,在这个意义上,添加这个调试代码可能会改变事情)

  • 典型的霍桑效应更像是这样的场景:一群猫在打篮球。一些女孩走上前观看。猫开始炫耀和热狗,其中一只摔断了腿。是女孩们的错吗?不,如果他们不看的话会发生吗?没有
更新2 谈论霍桑效应:当我将两个MessageBox.Show()调用复制到frmEntry.btnSave.click的catch块时,我得到了:

"Null Reference Exception"
"Null Reference Exception"
"Exception: NullReferenceException Location: frmEntry.Closing"
看,NRE的位置一直在移动,就像一只松鼠在乡间公路上遇到两辆朝相反方向行驶的汽车

更新3 这又一次发生了:将这些MessageBox.Show()添加到表单的关闭事件会导致NRE从另一个洞中弹出并声明自己。这种近亲繁殖的密码正在以一半的分数产生(或克隆)智慧,或者看起来是这样

更新4 如果写坏代码是一种犯罪,那么写这些东西的猫应该被单独关在一个超级监狱里

以下是最新的令人震惊的头巾商/号手:

int cancelled = ListRecords.cancelled;
if (cancelled == 0)
. . .
ListRecords的公共“已取消”成员(在另一个类中)只分配了0和1的值。因此,取消不仅听起来像bool,行为也像bool。为什么它没有被宣布为bool

这个代码库的官方形象应该是Edvard Munch的“尖叫”

更新5 也许我是在发泄,但最近的经历让我为某些类型的代码起了一个新名字,并为许多项目做了说明。我现在称之为“Winchester神秘屋代码”,它不去任何地方,只占用空间(分配任务,但随后不执行,或调用空的方法/处理程序)

对于一个典型的项目(我是一名“被俘”的员工,也是许多项目的承包商,在编程方面有将近20年的经验),我现在把这种情况比作一群人在流沙中打滚。当他们雇佣新人“上船”时,他们真的希望他们和他们一起跳入流沙。这对事情有什么帮助?这仅仅是一个“痛苦爱陪伴”的例子吗?他们应该做的是说“扔给我们一根绳子!”而不是“进来吧,流沙很好!”

很多时候,可能只是熵和“工作安全感”在起作用;如果他们继续与他们所选择或创造的怪物搏斗,他们来之不易的关于如何或多或少地阻止野兽的知识将使他们保持半舒适的工作。如果他们做出任何根本性的改变(IMO,大多数团队确实需要做出一些根本性的改进),这可能会危及他们的就业状况。也许答案是雇佣/承包“过渡团队”,将团队/公司从史前恐龙俱乐部时代转移到21世纪,培训“老守卫”,以便他们能够保住工作。毕竟,这些“救世主”根本不足以偷走老手的工作——训练他们,让他们加快速度,然后继续前进。所有人都会受益。但许多人似乎更喜欢继续在泥潭或流沙中打滚

在任何人雇佣程序员之前,他们至少应该给他们一次测试,通过测试将证明他们至少熟悉史蒂夫·麦康奈尔(Steve McConnell)的《代码完成》(Code Complete)中描述的基本原则

好了,回到与流沙搏斗的话题

更新6 或者:“重构Spo-dee-o-dee”:

重构的一个“问题”是,如果您更改变量的名称,例如:

ChangeListType chgLst; // ChangeListType is an enum
……为此:

ChangeListType changeListType;
…如果数据表中有一个名为“chgLst”的列,SQL语句也会被更改,这可能会毁掉(如果不是你的一天)至少一部分

另一个可能的问题是,当您得到“[var name]只被赋值,但其值从未被使用”提示时。你可能认为你可以漫不经心地解释所有这些,但是要注意,任何你可能注释掉的相关代码,以及对这些死变量的赋值,都不会产生副作用。诚然,这是一种糟糕的编码方式(将返回的VAL存储在被忽略的VAR中的有效方法),但是。。。这种情况经常发生,尤其是当最初的编码员是一个螺旋桨头疯狂的科学家牛仔时

这段代码充满了反模式,如果Butterick和/或Simplication与这家伙签订合同,我也不会感到惊讶

再想一想,除了这个项目的架构、设计、编码和格式之外,其实并没有那么糟糕

玛丽·雪莱的《弗兰肯斯坦》的确很有先见之明,但并不像大多数人想象的那样。与其说这是一种关于技术疯狂运行的普遍预感,不如说它更为具体:它是大多数现代软件项目的预兆,在这些项目中,来自这里和那里的“片段”与l随意地挤在一起