2012-12-12 33 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

相關問題