2011-09-20 51 views
0

我有點新來C#。使用分割時出現問題。我以爲它返回一個字符串數組。但一旦到達下面的最後一行,就會崩潰,並說我無法訪問它。越界。即使在拆分中它會找到多個'〜'。任何解決我的問題?問題與String.split

String tempString = " ";

 while ((tempString = streamReader.ReadLine()) != null) 
     { 
      String [] split = tempString.Split('~'); 

      typeOfVehicle = split[0]; 
      manufactuer = split[1]; 

非常感謝

問題解決。

+6

您是否檢查過'split.Length'來查看數組中有多少(以及哪些)元素? –

+1

您將它與null比較,但不檢查它是否爲空。如果返回的最後一個字符串不能被分割,那麼它將不會有這些索引 - 嘗試使用while(!String.IsNullOrEmpty(tempString = streamReader.ReadLine()){...} –

+0

是的數組中填充了10個項目。 – Cody

回答

2

你假設當你分割字符串時,你將至少有2個元素。永不假設。在嘗試訪問索引之前,請始終檢查數組的長度。

+0

好吧,如果OP檢查長度並且不執行代碼,那麼OP只會隱藏他有壞數據的事實,如果數據應該是乾淨的,那麼這實際上隱藏了一個* bug *。如果要檢查一個永遠不應該是假的條件,那麼OP應該,頂多扔一個* ne w *異常將繼續傳播錯誤,以便可以修復錯誤(無論它在哪裏)。 –

0

只是catch這個例外,你很快就會發現你正在閱讀的字符串有問題。

String[] split = tempString.Split('~'); 

try 
{ 
    typeOfVehicle = split[0]; 
    manufactuer = split[1]; 
} 
catch 
{ 
    Console.WriteLine("Oops! It didn't work."); 
    Console.WriteLine("The offending string was \"{0}\"", tempString); 
} 
+0

除非這是一個玩具應用程序,否則寫入控制檯可能是溝通錯誤的最糟糕方式。 (相反,用更好的消息傳遞引發異常) –

+0

不,我一直在我的產品系統中執行此操作。很棒。 –

+0

例如,如果這是一種可以由不是控制檯應用程序(即Windows或ASP.NET)的消費者調用的方法,那麼您基本上只會拋出錯誤消息。爲什麼採用僅適用於控制檯應用程序的模式(並且因爲您丟失了堆棧跟蹤,所以效果不佳)? –