use*_*626 0 c# object-reference nullreferenceexception
我正在编写一个二十一点程序,但我的问题是创建一个具有其他对象列表的对象时的解决方案,但是当我首先创建对象时,列表为空.我想这就是我收到这个错误的原因.下面是我的代码,我将播放器初始化为在播放器的构造函数中有一个手的实例,但是当我调用方法playerHand.Hit(card)时,我得到"对象引用未设置为对象的实例"错误消息;
public class Player
{
private string name;
public Hand playerHand;
public Player()
{ }
public Player(string name)
{
this.Name = name;
this.playerHand = new Hand();
}
public string Name
{
get { return name; }
set { name = value; }
}
public void TakeCard(Card card)
{ playerHand.Hit(card); }`
Run Code Online (Sandbox Code Playgroud)
`
public class Hand
{
public List<Card> hand;
public Hand()
{
hand = new List<Card>();
}
public int handValue;`
public void Hit(Card card)
{
hand.Add(card);
}
public int HandValue()
{
foreach (Card card in hand)
handValue += (int)card.value;
return handValue;
}
}
public class Game
{
public Game(IEnumerable<string> playerNames)
{
List<Player> players = new List<Player>();
foreach (string name in playerNames)
players.Add(new Player(name));
Player dealer = new Dealer();
players.Add(dealer);
Deck playingDeck = new Deck();
Deal(playingDeck, players);
Play(playingDeck, players);
DisplayResults(players);
}
public void Deal(Deck deck, List<Player> players)
{
deck.Shuffle();
for (int i = 1; i < 3; i++)
foreach (Player player in players)
player.TakeCard(deck.Deal());
}
Run Code Online (Sandbox Code Playgroud)
你有这条线:
Player dealer = new Dealer();
Run Code Online (Sandbox Code Playgroud)
你没有告诉我们代码Dealer.但是,从代码中可以明显看出Dealer : Player.请注意,您的默认构造函数Player永远不会初始化Player.playerHand.如果默认的构造函数Dealer调用默认的构造函数Player(和它在默认情况下),那么playerHand就会null对dealer.
所以,我的猜测就是playerHand.Hit(card);给你一个NullReferenceException什么时候调用,dealer因为你从来没有初始化Player.playerHand.
要修复它,只需提供一个初始化程序
public Hand playerHand = new Hand();
Run Code Online (Sandbox Code Playgroud)
并从构造函数中删除相应的行Player(string).
最后,除此之外,您的类中有太多public变量.你正在"泄漏"你的班级消费者可以不受约束地修改的变量,并破坏你的不变量.封装是游戏的名称.
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |