对象引用未设置为对象的实例,猜测不会添加到List <guess> </guess>

时间:2013-12-10 16:32:13

标签: c# asp.net-mvc

我是c#MVC的新手,我不明白我的错误:

Object reference not set to an instance of an object

我的控制器中有以下内容:

namespace Prigmore2013_01.Tests
{
    public class Exercise09Controller : Controller
    {
       ...
        public ActionResult GuessTheDigits(List<int> guesses)
        {
            GuessingGame theGame = this.Session["GameState"] as GuessingGame;
            theGame.GuessTheHiddenDigits(guesses);
            // The above is passing to the method in GuessingGame class?

            return RedirectToAction("Index", theGame);

        }
        ...
    }
}

我正在调用theGame.GuessTheHiddenDigits(guesses);并将其传递给以下类:

namespace Prigmore2013_01.Models
{
    public class GuessingGame
    {
        public GuessingGame()
        {

            this.Guesses = new List<Guess>();
            this.Target = new List<int>();
            this.guess = new List<int>();

        }
        public List<int> Target { get; set; }
        public List<Guess> Guesses { get; set; }
        public List<int> guess { get; set; }

        public void GuessTheHiddenDigits(List<int> guesses)
        {
            // getting the guesses passed from the controller, debugging shows that
            this.guess = new List<int>(guesses);
            Guess m = new Guess();
            m.Digits.AddRange(this.guess);
        }
    }
}

我有另一个名为Guess的课程:

namespace Prigmore2013_01.Models
{
    public class Guess
    {
        public Guess()
        {
            this.Digits = new List<int>();
        }

        public List<int> Digits { get; set; }

        public object RightDigitRightPosition { get; set; }

        public object RightDigitWrongPosition { get; set; }
    }
}

此处的上述方法public void GuessTheHiddenDigits(List<int> guesses)需要向(guesses)个对象添加提交的猜测List<Guess>。我以为我已经通过这样做实例化了这个方法:

this.guess = new List<int>(guesses);
Guess m = new Guess();
m.Digits.AddRange(this.guess);

编辑1: 找到我正在运行的单元测试中形成的错误:

[TestMethod]
        public void GuessTheHiddenDigitsAddsTheSubmittedGuessToTheListOfGuesses()
        {
            var theGame = new GuessingGame();
            /* NOTE : The next line forces us to add a behaviour to the GuessingGame
             * class: the GuessTheHiddenDigits() method.  
             * */
            theGame.GuessTheHiddenDigits(new List<int>() { 1, 2, 3 });
            var theContext = new FakeHttpContext();
            var theKey = "GameState";
            theContext.Session.Add(theKey, theGame);
            var controller = new Exercise09Controller();
            var request = new System.Web.Routing.RequestContext(theContext, new System.Web.Routing.RouteData());
            controller.ControllerContext = new System.Web.Mvc.ControllerContext(request, controller);
            //Finally, set up the new guess
            var theGuess = new List<int>() { 2, 3, 4 };

            //Act
            controller.GuessTheDigits(theGuess);
            var result = controller.ShowPreviousGuesses();
            var lastGuess = ((List<Guess>)result.Model).LastOrDefault();

            //Assert
            /* NOTE : This line forces another implementation decision: to use a
             * C# property for Guess.Digits to represent the player's guess.
             * */
            CollectionAssert.AreEqual(theGuess, lastGuess.Digits);
        }

我的单元测试在lastGuess.Digits上中断,因为它为null。这是否意味着我最初需要一个构造函数来创建一个新列表,这样不是null并且不会抛出错误?

我好像是围成一圈并且不太明白是什么原因造成了这种情况。是否有人可以向我解释为什么我的方法没有添加到我的List<Guess>以及将我提交的猜测添加到List<Guess>的最佳方法?

2 个答案:

答案 0 :(得分:2)

  

对象引用未设置为对象的实例

表示您使用的变量等于null,我猜以下行有问题:

GuessingGame theGame = this.Session["GameState"] as GuessingGame;
theGame.GuessTheHiddenDigits(guesses);

因此,在这种情况下theGame可能未设置,因为您尚未将其保存在Session["GameState"]中,因此它会因为您尝试在{{1}上调用方法而引发错误}变量。

<强>更新

由于您已经知道发生此错误的位置,因此您需要知道使用具有null值的变量会导致此类错误,以防止您需要初始化变量。

答案 1 :(得分:0)

首先,使用调试器,当您收到该错误时,请检查您的对象/属性以查看哪个为null。

  

我好像是围成一圈,不太明白是什么   导致不设置。有人可能吗?   向我解释为什么我的方法没有添加到我的列表和   将我提交的猜测添加到List的最佳方法?

GuessingGame.GuessTheHiddenDigits方法中,您正在创建一个Guess类型的本地范围对象,并将传递的List<int>添加到...那你实际上是在向GuessingGame.Guesses列表添加任何内容。那个&#39; m&#39;一旦该方法执行完毕,将被删除。

您是否打算添加&#39; m&#39;到你的名单?

像:

Guess m = new Guess();
m.Digits.AddRange(this.guess);
this.guess.Add(m);

哦,this.guess与公共媒体资源的命名规则不匹配......请改为称呼this.Guess