我是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>
的最佳方法?
答案 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
。