2012-12-12 34 views
1

例如,通过在声明时实例化,可以避免以下情况下可能的运行时空例外。例如,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似乎是足够的智慧告诉我们,“A空引用异常可能会导致在运行。”这意味着一些有能力的专业开发人员忽略了此警告这使我认为这一定是有原因的。开发者们已经开始了,但我不能问他们。这可能是我无法理解的基本原理。如果您愿意,请帮助我理解这一点。 (我不能是唯一一个想知道这个的人。)

+5

编译器不够聪明,发现“s”变量总是要分配的,即使它没有被初始化。不要*写*像这样的Try/Catch语句,当你的程序不正常时,它会给你带来很大的麻烦,而没有办法找出原因。 –

+0

感谢您的评论,@HansPassant。我很抱歉,但我不完全了解你。你能否详细说明一下? – One

+0

@RBarryYoung:如果未初始化,则'String'变量的值为Nothing。所以你*可以*得到一个异常。 – Neolisk

回答

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,您会注意到一条警告 - 在Return retString行中加下划线retString。所以你可以修复这个问题而不运行你的代码。

现在假设你初始化了Dim retString As String = ""。您将不再看到该警告,并且必须调试您的程序才能解决此问题。根据程序的复杂程度,可能需要付出更多努力。底线 - 最好是在编译时发现问题,而不是运行时。

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

Dim retString As String = Nothing 

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

+0

世界你看到错误并说“是的,这次是故意的”? – One

+1

@Onwuka:是的,这是可能的 - 请参阅我的编辑。 – Neolisk

+0

谢谢。 Upvoted。 – One

相关问题