允许某些运行时异常落空的原因是什么?

时间:2012-12-12 22:41:44

标签: vb.net initialization declaration

例如,通过在声明时实例化s,可以避免在下面的情况下出现可能的运行时空异常。例如,Dim s as String = ""我们是否有理由允许运行时异常的可能性?也许s成为""没有意义?这不是一个家庭作业问题。我只是好奇。

Public Function X() As String 
    Dim s as String 
    Dim sMethod As String = X 
    Try 
        Dim vowels() As String = {"a", "e", "i", "o", "u"}
        For Each vowel As String In vowels
            s = "0"
        Next
    Catch ex As Exception 
        Throw System.Exception(ex)
    End Try
    Return s 
End Function
  • 编辑以抛出异常

Visual Studio似乎足够聪明,可以告诉我们“在运行时可能会产生空引用异常”。这意味着一些有能力的专业开发人员忽略了这一警这让我觉得必须是有原因的。开发人员后来继续前进,所以我不能问他们。这可能是我无法理解的基本内容。如果你愿意,请帮助我理解这一点。 (我不能成为唯一一个对此感到疑惑的人。)

1 个答案:

答案 0 :(得分:1)

假设您没有初始化String变量。还有一些处理。最后,您希望得到一个确定的值,您可以通过Return语句返回该值。如果由于某种原因,您忘记考虑可能的执行路径,VS将警告您可能的空引用异常。然后你可能会想:“哦,是的,我怎么忘记了?”

例如,您有Function可将Integer转换为单词(实际使用有限,因此请将其视为演示用途):

Function ConvertIntToWord(a As Integer) As String
  Dim retString As String
  If a = 0
    retString = "Zero  "
  ElseIf a = 1
    retString = "One  " 
  End If
  Return retString
End Function

在上述内容中,您不幸忘记了Else路径。然后假设您要对结果字符串运行进一步处理:

ConvertIntToWord(5).TrimEnd

以5作为参数传递,此时您将获得异常。如果你改为听VS,你会注意到一个警告 - 在retString行中加下划线Return retString。因此,您可以在不运行代码的情况下解决此问题。

现在假设您初始化Dim retString As String = ""。您将不再看到警告,并且必须调试程序以解决此问题。根据程序的复杂程度,可能需要更多的努力。

底线 - 在编译时发现问题总是更好,而不是运行时。

编辑:忘记初始化变量可能是故意的,例如为什么要使用TryGetValue。对于此方法,值为is passed uninitialized,根据文档。但是,VS不知道这一点,所以它会继续显示警告,直到您明确地将其分配给Nothing

Dim retString As String = Nothing

所以这是告诉VS的一种方式,是的,你知道它是未初始化的,但对于这种特殊情况,它是故意的。