例如,通过在声明时实例化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似乎足够聪明,可以告诉我们“在运行时可能会产生空引用异常”。这意味着一些有能力的专业开发人员忽略了这一警这让我觉得必须是有原因的。开发人员后来继续前进,所以我不能问他们。这可能是我无法理解的基本内容。如果你愿意,请帮助我理解这一点。 (我不能成为唯一一个对此感到疑惑的人。)
答案 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的一种方式,是的,你知道它是未初始化的,但对于这种特殊情况,它是故意的。