2011-11-18 45 views
2

enter image description hereC#對象引用未設置爲對象?

public static void duel(String user, String user1, String user2) 
     { 
      int[] value = null; 
      String winner; 
      for (int i = 0; i < 2; i++) 
      { 
       Random rand = new Random((int)DateTime.Now.Ticks); 
       int numIterations = 0; 
       numIterations = rand.Next(2, 12); 
       value[i] = numIterations;//This is line 286 
      } 
      if (value[0] > value[1]) 
      { 
       winner = user1; 
      } 
      else 
      { 
       winner = user2; 
      } 
      Console.WriteLine(user + " Started a duel against " + user1 + " and " + user2 + "!"); 
      Console.WriteLine(user1 + " rolled " + value[0] + " and " + user2 + " rolled " + value[1] + "!"); 
      Console.WriteLine(winner + " is the winner!"); 
     } 

究竟什麼是錯在這裏?當我設置int[] value = null它編譯,但是如果我刪除空它說Use of unassigned local variable 'value' Line 286

回答

9

嗯,是的,你有你使用它之前的值賦給變量value - 但是當你將它設置爲空,你會得到一個NullReferenceException時你嘗試使用它。它看起來像你想兩個元素的數組,因此使用

int[] value = new int[2]; 

然而,你寫你幾乎肯定會與這兩個值是相同的結束代碼,如你創建兩個實例的Random幾乎完全相同的時間。請參閱我的article on Random瞭解更多信息。

我會通過一個Random實例到方法,並把它改寫這樣的 - 沒有多少有些-無意義循環:

public static void Duel(Random rng, String user, String user1, String user2) 
{ 
    // Using Next(2, 12) doesn't really mimic 2 dice of 1-6; it actually mimics 
    // a single 10-sided die with values 2 to 11 inclusive. 
    int score1 = rng.Next(1, 7) + rng.Next(1, 7); 
    int score2 = rng.Next(1, 7) + rng.Next(1, 7); 

    // Note: this is biased in favour of user2 in case of equality 
    string winner = score1 > score2 ? user1 : user2; 

    Console.WriteLine("{0} started a duel between {0} and {1}!", 
         user, user1, user2); 
    Console.WriteLine("{0} rolled {1} and {2} rolled {3}!", user1, score1, 
         user2, score2); 
    Console.WriteLine("{0} is the winner!", winner); 
} 

東西這裏要注意:

  • 我們的方法取決於什麼它不一定能正確創建它自己(Random),因此被注入。
  • 模擬滾動兩個骰子(這是我假設的目標是)通過滾動兩個單一的骰子,而不是在[2, 12]範圍內統一挑選一個單一的數字。
  • Random.Next第二個參數是一個獨家上限(我是錯的,直到我被檢查過來)
  • 使用條件運算符的,當你想挑一個表情或其他基於條件和做同樣的事情,結果無論哪種方式
  • 使用composite format strings使它比簡單的拼接
  • 容易格式字符串以下.NET命名約定(Duel,不duel
+0

哇,我也有相同的數字問題。我打算用睡眠(100)來修復它;但是謝謝你給我看你的兩個骰子! <3感謝Jon ^。^一如既往的精彩回答:p – Kyle

+2

@Kyle:小心 - 我剛剛解決了我的問題,因爲我搞亂了對Random.Next的調用。檢查編輯。 –

+0

感謝喬恩的詳細的答案和註釋。 <3 – Kyle

5

行更改爲:

int[] value = new int[2]; 

您需要創建一個空數組,這樣就可以在以後使用它。

如果您沒有將它設置爲Use of unassigned local variable,因爲您聲明瞭該變量,但尚未給出該值。

如果你將它設置爲null,那就是給它一個值,但是你也沒有在這個變量中放置任何東西。下面的代碼希望能夠使用元素0和1,但是儘管您聲明value是一個數組,但您尚未創建要放入該變量的數組,因此在嘗試訪問元素時遇到錯誤不存在的數組。

上述修正了這個代碼由變量設置爲與2元件的陣列,其中將包括對陣列(int),在這種情況下將是0直到它們設置等於東西在類型的默認。


壞比喻時間:

想象我打算把書架在我的臥室。我爲它騰出空間(聲明變量),但是我不在該空間放置書架(將變量設置爲空,或者根本不設置它)。

,如果我去,以獲得第二架我顯然會因爲雖然我在我的房間做空間(變量)有問題的東西(我的程序)我沒有把書架那裏(聲明一個數組進入變量)。


欲瞭解更多信息,請參閱Arrays Tutorial on MSDN

+0

不要採取這種錯誤的方式,但你會介意給他理由,爲什麼他應該這樣做嗎?他顯然需要學習如何正確創建更高級變量的實例(與string,int等相比)的基礎知識。 – Joakim

+0

@Joakim:在我編輯之前,你寫過這些嗎? –

+0

我喜歡你的比喻。 :)謝謝你的回答 – Kyle

3

您正在引用值[i],但您尚未實際初始化值[]。 你需要做的是這樣

value = new int[2]; 
0

在c#中,您需要初始化您的變量爲某個值,否則將無法編譯。要修復運行時錯誤,您需要將值初始化爲一個數組(而不是空值)。既然你是通過價值循環兩次,我認爲你需要做的是這樣的:

int[] value = new int[2]; 
0

你需要的地方創建數組:

int[] value = new int[2]; 
2

你還沒有指定您的int[]一個實例。如果你知道總會有兩個值,你可以使用:

int[] value = new int[2]; 

如果你不知道你將永遠只能有2個值,可以考慮使用一個列表:

List<int> value = new List<int>(); 
0

如果你只需在開始時聲明數組,你應該是安全的。

int[] value = new int[2]; 
相關問題