C # exception debugging?

Below is my code for the game "Armadillo". I keep getting the following error:

The process terminated due to a StackOverflowException exception.,

He continues to point to

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

How can this be fixed?

 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
source share
4 answers

Your BattleshipBoard object creates a Player object during construction, and your Player object creates a BattleshipBoard during construction. This is repeated back and forth until you overflow the stack.

Call:

 BattleshipBoard b = new BattleshipBoard(); 

will never return and cause an overflow.

+10
source

Stack overflow is usually caused by endless return; that is, function A calls B, and then B and A and A do not have a termination condition.

In your case, its initializing the two classes BattleshipBoard and Player .

Your Player creates a new BattleshipBoard , and BattleshipBoard creates a new Player !

Delete the line Player p = new Player(); from the BattleshipBoard , and everything should be fine.

+1
source

When you try to create your original BattleshipBoard, this leads to an endless loop, alternately creating your two types.

If you want the two classes to have a link to another corresponding class, you can force your Player class to take the BattleshipBoard in your constructor.

+1
source

Your BattleShipBoard has a Player that has a BattleShipBoard that has a Player that has a BattleShipBoard that has [ ... last forever ... ]

Therefore, you have a stack overflow.

0
source

All Articles