【问题标题】:Compiler warning: null reference exception编译器警告:空引用异常
【发布时间】:2015-07-30 23:06:58
【问题描述】:

我在 Visual Studio 2005 中有以下代码。

    Dim OutFile As System.IO.StreamWriter
    Try
        OutFile = New System.IO.StreamWriter(Filename)
       // Do stuff with OutFile
    Catch Ex As Exception
       // Handle Exception
    Finally
       If OutFile IsNot Nothing Then OutFile.Close()
    End Try

但是 VS2005 对“If OutFile IsNot..”这一行提出了警告

变量“OutFile”在被赋值之前被使用。运行时可能会导致空引用异常。

是否有某种方法可以通过巧妙地更改代码来消除此警告,或者是否有更好的方法来做我想做的事情?

谢谢

罗伯

【问题讨论】:

    标签: vb.net visual-studio-2005


    【解决方案1】:
    Dim OutFile As System.IO.StreamWriter
    OutFile = Nothing
    Try
        OutFile = New System.IO.StreamWriter(Filename)
       // Do stuff with OutFile
    Catch Ex As Exception
       // Handle Exception
    Finally
       If OutFile IsNot Nothing Then OutFile.Close()
    End Try
    

    类似于C# error: Use of unassigned local variable

    【讨论】:

    • 差不多,但它为我指明了正确的方向。 NULL 是不允许的,但 Outfile = Nothing 可以解决问题。谢谢。
    • 刚刚注意到并修复了它。如果你猜不出来,我通常用 c# 编程。
    • :) 有一个没有警告的项目真是太好了。再次感谢。
    • 所以我们必须使用赋值来避免警告...?看起来很愚蠢,尤其是因为您没有将其分配给任何内容,这意味着应该仍然存在相同的警告,因为空引用仍然可能发生。这是愚蠢的! VS 甚至不应该浪费时间试图弄清楚我的代码是否会给出一个空引用;必须有办法禁用此警告。
    • 并非如此。它不是试图防止空引用,而是意外遗漏默认值。强制您显式提供默认值以删除警告会使您意识到您可能未定义变量。
    【解决方案2】:

    这是一个范围问题,outfile 对象的初始化发生在对 fianlly 块不可见的代码块中。

    【讨论】:

      【解决方案3】:

      当然,接受的答案是正确的,但它没有解释为什么或何时显式初始化可能很重要。

      VB.NET通常在声明变量时分配默认值(0Nothing),但在某些极端情况下不会。

      考虑这个简单的控制台应用程序:

      Sub Main()
          For i As Integer = 1 To 5
              Dim number As Integer
              If i = 3 Then number = 3
      
              Console.Write(number)
          Next
      End Sub
      

      输出是什么样的?您可能期望循环的每次迭代都将number 设置为0,并且仅在循环的第三次迭代时才设置为3。然后对于第四次和第五次迭代,它又是0。所以输出是00300,对吧?不是这样。这段代码的输出其实是

      00333

      这是因为在 VB.NET 中,在循环中声明的变量的生命周期是针对 整个 循环的,而不是针对循环的一次迭代(不是您所期望的,对吧?) .但是如果你在声明时明确地将number 的值设置为0,就像这样

      Dim number As Integer = 0
      

      然后输出看起来像

      00300

      因此,通常假设 VB.NET 会在您 Dim 变量时设置默认值,但将其显式设置为 0Nothing 始终是最安全的预期的行为。

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多