调试C# - 堆栈溢出异常?

时间:2011-06-06 01:47:30

标签: c# stack-overflow

以下是我的战舰游戏代码。我一直收到以下错误:

  

由于StackOverflowException,进程终止。 。

它一直指向

char[,] Grid = new char[10, 10];

如何解决这个问题?

using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BattleShip_Jamshid_Berdimuratov
{
class BattleshipBoard
{
    Player p = new Player();
    public void Randomize()
    {
        p.SetGrid(1, 2);
        p.SetGrid(2, 2);
        p.SetGrid(3, 2);
    }

    public void DisplayBoard(char[,] Board)
    {
        int Row;
        int Column;

        Console.WriteLine(" ¦ 0 1 2 3 4 5 6 7 8 9");
        Console.WriteLine("--+--------------------");
        for (Row = 0; Row <= 9; Row++)
        {
            Console.Write((Row).ToString() + " ¦ ");
            for (Column = 0; Column <= 9; Column++)
            {
                Console.Write(Board[Column, Row] + " ");
            }
            Console.WriteLine();
        }

        Console.WriteLine("\n");
    }
}

class Player
{
    char[,] Grid = new char[10, 10];
    public int HitCount = 0;
    public int MissCount = 0;
    int x = 0;
    int y = 0;
    BattleshipBoard b = new BattleshipBoard();

    public int getHitCount()
    {
        return HitCount;
    }
    public int getMissCount()
    {
        return MissCount;
    }
    public void AskCoordinates()
    {
        Console.WriteLine("Enter X");
        string line = Console.ReadLine();
        int value;
        if (int.TryParse(line, out value))
        {
            x = value;
        }
        else
        {
            Console.WriteLine("Not an integer!");
        }

        Console.WriteLine("Enter Y");
        line = Console.ReadLine();
        if (int.TryParse(line, out value))
        {
            y = value;
        }
        else
        {
            Console.WriteLine("Not an integer!");
        }

        try
        {
            if (Grid[x, y].Equals('S'))
            {
                Grid[x, y] = 'H';
                Console.Clear();
                Console.WriteLine("Hit!");
                HitCount += 1;
            }
            else
            {
                Grid[x, y] = 'M';
                Console.Clear();
                Console.WriteLine("Miss!");
            }
        }
        catch
        {
            Console.Clear();
            Console.WriteLine("Error: Please enter numbers between 0 and 9. (Inclusive)");
        }
    }
    public char[,] GetGrid()
    {
        return Grid;
    }
    public void SetGrid(int x, int y)
    {
        Grid[x, y] = 'S';
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.Title = "BerdShip!";
        Console.WriteLine("Welcome to Berdship!\r\n\r\n");
        Console.WriteLine("What is your name?");
        string name = System.Console.ReadLine();
        Console.WriteLine();
        BattleshipBoard b = new BattleshipBoard();
        Player p = new Player();
        b.Randomize();
        while (p.getHitCount() < 12)
        {
            b.DisplayBoard(p.GetGrid());
            p.AskCoordinates();
        }
        Console.WriteLine("Congratulations, " + name + "! You Win!");
        Console.WriteLine("Thanks for playing BerdShip. Press enter to quit.");
    }
}

}

4 个答案:

答案 0 :(得分:10)

您的BattleshipBoard对象在构造期间创建一个Player对象,并且您的Player对象在构造期间创建BattleshipBoard。这会来回迭代,直到你溢出堆栈。

致电:

BattleshipBoard b = new BattleshipBoard();

永远不会返回并导致溢出。

答案 1 :(得分:1)

堆栈溢出通常是由无限重复引起的;即函数A调用B然后调用B,A和A没有终止条件。

在您的情况下,它是您的两个班级BattleshipBoardPlayer的初始化。

您的Player创建了一个新的BattleshipBoardBattleshipBoard创建了一个新的Player

Player p = new Player();删除行BattleshipBoard,一切都很好。

答案 2 :(得分:1)

当您尝试创建最初的BattleshipBoard时,会导致无限循环交替创建您的两种类型。

如果您希望这两个类具有对另一个对应类的引用,那么您可以让您的Player类在其构造函数中使用BattleshipBoard。

答案 3 :(得分:0)

您的BattleShipBoard有一个PlayerBattleShipBoard的{​​{1}} Player BattleShipBoard有一个[ ...永远地继续...... ]

因此,您有堆栈溢出。