2012-03-23 83 views
0

好的,所以我一直試圖解決這個問題很長一段時間。我的代碼中有一個「警告」 - 「檢測到無法訪問的代碼」。我不知道如何解決這個問題,這就是我在這裏發佈的原因。下面是代碼:檢測到無法檢測到的代碼警告

public static byte Authenticate(string UserName, string Password) 
    { 
     try 
     { 
      MySqlDataAdapter DataAdapter = new MySqlDataAdapter("SELECT * FROM `Accounts` WHERE `AccountID` = '" + UserName + "'", Connection); 
      DataSet DSet = new DataSet(); 

      DataAdapter.Fill(DSet, "Account"); 

      if (DSet != null && DSet.Tables["Account"].Rows.Count > 0) 
      { 
       DataRow DR = DSet.Tables["Account"].Rows[0]; 

       string Pass = (string)DR["Password"]; 
       if (Pass == Password || Pass == "") 
       { 
        if (Pass == "") 
        { 
         MySqlCommand Command = new MySqlCommand("UPDATE `Accounts` SET `Password` = '" + Password + "' WHERE `AccountID` = '" + UserName + "'", Connection); 
         Command.ExecuteNonQuery(); 
        } 

        uint LogonCount = (uint)DR["LogonCount"]; 
        LogonCount++; 

        MySqlCommand Comm = new MySqlCommand("UPDATE `Accounts` SET `LogonCount` = " + LogonCount + " WHERE `AccountID` = '" + UserName + "'", Connection); 
        Comm.ExecuteNonQuery(); 

        return Convert.ToByte((uint)DR["LogonType"]); 
       } 
       else 
        return 0; 
      } 
      else 
       return 0; 
     } 

     catch (Exception Exc) { General.WriteLine(Exc.ToString()); return 0; General.ServerRestart(); } 
    } 

我不知道如何來突出它的紅色,所以我會發布具體線路:

catch (Exception Exc) { General.WriteLine(Exc.ToString()); return 0; General.ServerRestart(); } 

的警告是「常規」 .ServerRestart();

+10

當你在你突出顯示的代碼行中點擊'return 0;'時,你自然期望執行下面的語句嗎?因爲你不應該。編譯器也沒有。埃爾戈,它被標記爲無法訪問。 – 2012-03-23 03:05:31

+1

以上不應該是一個評論...這是答案。 :)由於你正在處理異常,並且仍然期望該方法返回一個值,所以在'General.ServerRestart();'之後移動'return 0;'而不是之前。 – 2012-03-23 03:09:34

回答

1

你正在過早返回。退貨後的報表不會被執行,因爲它們是「無法到達」的。

0

當您返回某些內容時,它會結束該方法。它不可能返回多個值,除非它是一個列表。甚至列表將在一行中返回,如return ListName;

+0

所以我應該像這樣切換它們: catch(Exception Exc){General.WriteLine(Exc.ToString()); General.ServerRestart();返回0; } – 2012-03-23 03:09:49

+0

@DonavonDecker是的 – SimpleVar 2012-03-23 03:12:54

+0

「不可能返回多個值」...?有人沒有聽說過發電機(原諒我......'點查員')。 :) – cHao 2012-03-23 03:17:41

4

General.ServerRestart()必須在您調用return之前發生。立即返回退出方法之前沒有任何跑了剩下的代碼,因此爲「無法訪問代碼」的警告

1
catch (Exception Exc) { General.WriteLine(Exc.ToString()); return 0; General.ServerRestart(); } 

應該是:

catch (Exception Exc) { General.WriteLine(Exc.ToString()); General.ServerRestart(); return 0; } 

你不能叫General.ServerRestart你已經後剛剛退出該功能。

2
catch (Exception Exc) 
{ 
    General.WriteLine(Exc.ToString()); 
    return 0; 
    General.ServerRestart(); 
} 

在你的catch塊中,你返回一個值然後執行額外的函數。

當您編寫「return 0;」時,函數完成時不會將返回值設置爲0,但會返回值0作爲函數的結果,並在該點停止函數。 所以,當你有一個return語句時,之後的任何代碼將永遠不會被執行,因爲函數將在return語句之前終止。

注意這種情況:

// ... some code 1 

if (someExpression) 
{ 
    // ... some code 2 

    return; 

    // ... some code 3 
} 

// ... some code 4 

return; 

// ... some code 5 

的代碼1將一直執行。如果someExpression爲真 - code2將執行(否則其他),否則 - 代碼4將執行(而其他不會)。 在任何情況下,code3和code5都不會執行,因爲在它們的每個透視代碼路徑中,它們都是在返回語句之後。