2012-04-13 65 views
3

爲什麼會這樣的代碼(在我的窗體的_Load()事件):空字符串是空引用?

FileVersionInfo vi = FileVersionInfo.GetVersionInfo(_fullPath); 
String VersionInfo = vi.FileVersion; 
if (VersionInfo.Trim().Equals(String.Empty)) { 
    VersionInfo = NO_VERSION_INFO_AVAILABLE; 
} 
textBoxVersionInfo.Text = VersionInfo; 

,給我下面的錯誤消息時VersionInfo == ""是真的嗎?

System.NullReferenceException了未處理 消息=對象引用不設置爲一個對象的一個​​實例。*

+2

爲什麼不使用'if(string.IsNullOrEmpty(VersionInfo))...'來覆蓋你的基地? – Bridge 2012-04-13 19:52:32

+1

你知道這個失敗的確切代碼行嗎? – 2012-04-13 19:52:38

+0

@Steve:是的,在「Equals」行中。我將代碼移到了Shown()事件中,並且它在那裏正常工作。 – 2012-04-13 19:54:24

回答

2

有一個null -safe辦法做到這一點:不是

VersionInfo.Trim().Equals(String.Empty) 

string.IsNullOrWhiteSpace(VersionInfo) 

它不會崩潰,如果VersionInfo是空的,如果修剪VersionInfo結果,它將返回true在一個空的字符串中。

2

如果VersionInfo is NULL爲真,那麼VersionInfo.Trim()將給出錯誤。

請使用String.IsNullOrEmpty

如果VERSIONINFO爲空,那麼你就可以

if(VersionInfo == null) 

String.IsNullOrEmpty(VersionInfo)

+0

「VersionInfo不是對象」那麼,如果不是對象,那麼什麼是'VersionInfo'?它不能'空'... – dasblinkenlight 2012-04-13 19:56:31

+0

我試過沒有修剪(),它沒有區別。 – 2012-04-13 19:56:38

+0

如果'vi.FileVersion'爲空,那麼VersionInfo可能爲空,我想。 – sarwar026 2012-04-13 20:05:38

7

檢查,你應該在這裏使用String.IsNullOrEmpty方法。 See MSDN

if (String.IsNullOrEmpty(VersionInfo)) { 
    VersionInfo = NO_VERSION_INFO_AVAILABLE;} 
4

好,因爲我對我的其他問題得到倒票荒謬的數字,這裏又是一個較爲生硬,少輕快時尚:

  • null代表缺乏對象;和
  • 所有字符串都是對象;因此
  • 沒有字符串,任何長度,這是null;因此
  • 一個空字符串永遠不會是null

就是這樣,僅此而已。 檢查堆棧跟蹤和/或附加調試找出其中null(這是不一個空字符串)是來自。

例外的是使用expr.somePropertyFieldOrMethod其中expr的計算結果爲null 因此Null引用異常的結果。

這是,開發,作業,找出exprnull而不是等着看別人的建議可能是錯的。因此,在回答題目中的問題之後,我將其視爲「過於本土化」,這是目前唯一的問題。

(正如我以前的答案,我注意到,textBoxVersionInfonull可能會導致這個例外,即使VersionInfo == ""是真實的。另一種方法是,當然,VersionInfo代表空字符串。 )


技術上此異常可以任意提高,也許在擴展方法合理。但是,肆意提出這種例外是而不是常見或良好實踐或在.NET框架中發現的,因此在調試時通常是可以接受的原因。

1

在回覆我的評論後,您知道VersionInfo爲空。對Trim()的調用失敗,因爲它會在檢查之前執行,如果它等於String.Empty

您應該使用(string.IsNullOrEmpty(VersionInfo) || VersionInfo.Trim().Length < 1)而不是(如果您使用.NET 4則使用string.IsNullOrWhiteSpace(VersionInfo))。

編輯:

看到到你刪除TRIM(),它仍然無法正常工作的另一個回答你的反應......在這一點之後,它的Equals稱之爲將打破。嘗試上面提到的代碼,它應該工作正常。

+0

解決此問題的根本原因是將代碼從Load()事件移至Shown()事件。 Load()在生命[週期,時間]中顯然過早,因爲某些屬性可以安全地訪問。 – 2012-04-16 16:47:26