这里的rb'e公式是为什么rab小于等于rb?

Basic特有的原因很少见(可能只有一个) .

这个答案将使用Visual Basic术语,语法和上下文 . 使用的示例来自大量过去的Stack Overflow问题 . 这是为了通过使用帖子中经常出现的各种情况来最大化相关性 . 还为那些可能需要它的人提供了更多的解释 . 这里列出了与您类似的示例 .

  • 这是基于概念的:没有代码可以粘贴到您的项目中 . 它旨在帮助您了解导致 NullReferenceException (NRE)的原因,如何找到它,如何修复它以及如何避免它 . NRE可以通过多种方式引起,因此这不太可能是您唯一的遭遇 .

  • 示例(来自Stack Overflow帖子)并不总是显示最好的方法来做一些事情 .

  • 通常,使用最简单的补救措施 .

  • 您的代码声明了一个对象变量,但它没有初始化它(创建一个实例或'实例化'它)

  • 您的代码假设初始化对象的东西没有

  • 可能,其他代码过早地使仍在使用的对象失效

由于问题是对象引用 Nothing ,答案是检查它们以找出哪一个 . 然后确定它未初始化的原因 . 将鼠标悬停在各种变量上,Visual Studio(VS)将显示其值 - 罪魁祸首将是 Nothing .

您还应该从相关代码中删除任何Try / Catch块,尤其是Catch块中没有任何内容的块 . 这将导致代码在尝试使用 Nothing 的对象时崩溃 . This is what you want 因为它会识别问题的确切位置,并允许您识别导致问题的对象 .

显示 Error 集合(其中有许多变体 - 列表,字典等) .


这是获得NRE的一种相当常见的方式 . 在C#中,IDE将根据其编码方式报告 Controls 在当前上下文中不存在,或"cannot reference non-static member" . 所以,在某种程度上,这是一个仅限VB的情况 . 它也很复杂,因为它可能导致级联故障 .

无法以这种方式初始化数组和集合 . 此初始化代码将在构造函数创建 FormControls 之前运行 . 结果是:

  • 数组将包含五个Nothing元素

稍后引用数组元素将导致NRE . 如果您在 Form_Load 中执行此操作,由于奇怪的错误,IDE可能不会在发生异常时报告该异常 . 当您的代码尝试使用该数组时,将弹出异常 . 这"silent exception"是 . 出于我们的目的,关键是当创建表单( Sub NewForm Load 事件)时发生灾难性事件时,异常可能未被报告,代码退出过程并仅显示表单 .

由于您的 Sub NewForm Load 事件中没有其他代码将在NRE之后运行,因此许多其他内容可以保持未初始化状态 .

Note 这适用于任何和所有控制和组件引用,使这些引用非法:

很奇怪VB没有提供警告,但是补救措施是在表单级别使用 declare 容器,但是当控件 do 存在时,它们将在表单加载事件处理程序中 . 只要您的代码在 InitializeComponent 调用之后,就可以在 Sub New 中完成此操作:

Nothing 将再次存储在那些数组元素中,并且当您尝试引用它时将产生NRE .

现在你知道你在寻找什么,这些应该很容易找到:

而不是使用表单的 Controls 集合按名称间接引用,使用控件引用:


时尝试使用返回的任何内容都将导致NRE:


一个执行不当的Try / Catch可以隐藏问题所在并导致新问题:

这是一个未按预期创建对象的情况,但也演示了空 Catch 的计数器有用性 .

一个空的 Catch 街区是魔鬼的游乐场 . 这个OP感到困惑,为什么他在 Finally 区块获得NRE . 在其他情况下,一个空的 Catch 可能会导致下游的其他东西变得更加混乱,并导致您花时间在错误的地方查找错误的问题 . (上述"silent exception"提供相同的娱乐 Value . )

不要使用空的Try / Catch块 - 让代码崩溃,以便a)确定原因b)识别位置和c)应用适当的补救措施 . Try / Catch块不是为了隐藏来自唯一有资格修复它们的人的例外 - 开发人员 .


和以前一样,您可以测试Nothing,然后测试特定值:


DGV有一些周期性的怪癖:

手动命名列,或按索引引用:


由于VB正在为您管理设置,因此期望它初始化集合是合理的 . 它将会,但前提是您之前已在集合中添加了一个初始条目(在“设置”编辑器中) . 由于在添加项目时(显然)初始化了集合,因此当设置编辑器中没有要添加的项目时,它仍然是 Nothing .

如果/在需要时,在表单的 Load 事件处理程序中初始化设置集合:


您可能忘记了 New 运算符 .

你假设的东西可以完美无瑕地将初始化对象返回到你的代码,但事实并非如此 .


我要回帖

更多关于 荣事达rb7008bs显示e9 的文章

 

随机推荐