2013-11-02 85 views
1

似乎這個特定的錯誤已經被解決了很多次,但是我的代碼片段有一些不同之處,因爲它永遠不會導致「未分配」錯誤。在Try Catch中使用未分配的局部變量

此代碼來自我爲學校所做的一個項目。我被允許尋求幫助,這是我希望在這裏找到的。我不在乎掩蓋任何變數或任何因爲它不是用於商業目的。

這是在編譯時錯誤: 「未分配的局部變量的使用‘dateStartedActual’」

switch (userType) 
{ 
    case "Doctor": 
     string qualification = Microsoft.VisualBasic.Interaction.InputBox("What is the highest qualification this person has", "Qualification", "", -1, -1); 
     while (dateStarted == "") 
     { 
      try 
      { 
       dateStarted = Microsoft.VisualBasic.Interaction.InputBox("On which date did this person start", "Date Started", "", -1, -1); 
       int day = Convert.ToInt32(Regex.Match(dateStarted, @"\d{2}").Value); 
       dateStarted.Remove(0,3); 
       int month = Convert.ToInt32(Regex.Match(dateStarted, @"\d{2}").Value); 
       dateStarted.Remove(0,3); 
       int year = Convert.ToInt32(Regex.Match(dateStarted, @"\d{4}").Value); 
       dateStartedActual = new DateTime(day, month, year); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("The date entered is not valid"); 
       dateStarted = ""; 
      } 
     } 
     string field = Microsoft.VisualBasic.Interaction.InputBox("In which field does this person practice", "Field", "", -1, -1); 
     CreateDoctor(qualification, dateStartedActual, field); 
     break; 

回答

1

我的代碼段有一些不同之處在於它不會導致「未分配」的錯誤

那麼很明顯確實導致該錯誤,這就是爲什麼你問這個問題,不是嗎?

儘管知道任何時候拋出異常,你會再次繞着循環,編譯器不知道...因此錯誤。值爲而不是已明確分配。當然,你可以給它一個虛擬的價值開始 - 但我個人不喜歡這樣做。

你會更好提取解析代碼放到一個單獨的方法,這可能看起來像:

static DateTime RequestStartDate() 
{ 
    while (true) 
    { 
     try 
     { 
      // Ask for date and parse it 
      // ... 
      return parsedDate; 
     } 
     catch (Exception e) // See below... 
     { 
      MessageBox.Show("The date entered is not valid"); 
     } 
    } 
} 

這種方法肯定會返回一個DateTime最終,還是永遠保持循環 - 因此,任何變量分配通過調用該方法將被明確分配。

然後在你的主代碼,你可以寫:

switch (userType) 
{ 
    case "Doctor": 
     string qualification = Microsoft.VisualBasic.Interaction.InputBox("What is the highest qualification this person has", "Qualification", "", -1, -1); 
     DateTime dateStarted = RequestStartDate(); 
     string field = Microsoft.VisualBasic.Interaction.InputBox("In which field does this person practice", "Field", "", -1, -1); 
     CreateDoctor(qualification, dateStarted, field); 
     break; 

順便說一句,你打電話string.Remove,而忽略結果 - 總是一個壞主意。手動解析日期是不必要的複雜 - 使用DateTime.TryParseExact

此外,捕Exception通常是一個壞主意 - 你應該抓住具體例外......但如果你使用DateTime.TryParseExact你不會需要捕捉到任何,因爲它只會如果該值不能返回false被解析。

我也勸你至少using指令爲Microsoft.VisualBasic,這樣你可以用:

string qualification = Interaction.InputBox(...); 

等,而不是每次有一個巨大的長隊。

+0

它是在while循環中檢查dateStarted ==爲「」,它將被設置爲catch中的值。所以同時將再次從頂部啓動try catch塊。如果日期不正確,它將永遠不會到達CreateDoctor – Aernor

+0

@Anor:是的,意識到並編輯。 –

+0

謝謝,我會嘗試。感謝您的及時回覆 – Aernor

2

有兩種方法可以解決這個錯誤。

首先

分配在catch塊dateStartedActual一些值。

OR

提供try塊之前的dateStartedActual一些默認值。在這種情況下,如果在try塊中有任何異常,您的dateStartedActual將具有您提供的默認值。

+0

這似乎是一個解決錯誤的好方法,但我寧願讓輸入框要求用戶填寫正確的日期,而不是輸入默認值到我的數據庫 – Aernor

+0

@Aeror:你錯過了點 - 你已經循環,所以默認值不會被實際使用。但我仍然認爲這是一個醜陋的方法 - 我肯定會將它提取到不同的方法。 –

+0

我想投這個答案,因爲它是我的解決方案的一部分,但我是新來這個論壇 – Aernor

相關問題