alexanderd5398
alexanderd5398

Reputation: 327

I can't find the cause of this Stack Overflow Exception

Ever since I added the CheckForCollision_Enemy method, I've been getting a stack overflow exception every time I run my code. Here is the CheckForCollision_Enemy method, in the Main class.

 Public Sub CheckForCollision_Enemy()
    Dim ship1 As New Enemy(Nothing, Nothing)
    Dim ship2 As New Enemy(Nothing, Nothing)
    Debug.Print("")

    Dim ships = {acc_e, bs_e, sb_e, ds_e, pb_e}

    For i As Integer = 0 To ships.Length - 1
        ship1 = ships(i)
        For j As Integer = 0 To ships.Length - 1
            ship2 = ships(j)
            If ship1.name <> ship2.name Then
                For l As Integer = 0 To ship1.length - 1
                    For t As Integer = 0 To ship2.length - 1
                        If ship1.space_filled(l, 0) = ship2.space_filled(t, 0) And ship1.space_filled(l, 1) = ship2.space_filled(t, 1) Then
                            Debug.Print("Collision at {" & ship1.space_filled(l, 0) & ", " & ship1.space_filled(l, 1) & "} " & ship1.name & " VS " & ship2.name)
                        End If
                    Next
                Next
            End If
        Next
    Next


End Sub

Here is the Enemy class. This is the class where the error is shown. I marked exactly where as a comment.

Shared gen As New Random()
Dim x As Integer = 0
Dim y As Integer = 0
Public Sub New(ByVal namep As String, ByVal lengthp As Integer)
    name = namep
    length = lengthp

    ReDim _start_point(2)
    ReDim _space_filled(length, 2)

    GenerateDirection()
    If direction = "horizontal" Then
        x = gen.Next(0, 11 - length)
        y = gen.Next(0, 10)
    ElseIf direction = "vertical" Then
        x = gen.Next(0, 10)
        y = gen.Next(0, 11 - length)
    End If
    GenerateStartPoint()
    ExtendStartPoint()

    DefineFilled()
    ColorFilled()

    Main.CheckForCollision_Enemy() 'If this is taken out, it will work fine.
End Sub

    Public Sub GenerateStartPoint()
    start_point = {x, y}
End Sub
Public Sub GenerateDirection()
    If gen.Next(0, 2) = 0 Then
        direction = "horizontal"
    Else
        direction = "vertical"
    End If
End Sub

Public Sub ExtendStartPoint()
    If direction = "horizontal" Then
        For i As Integer = 0 To length - 1
            space_filled(i, 0) = start_point(0) + i
            space_filled(i, 1) = start_point(1)
        Next
    ElseIf direction = "vertical" Then
        For i As Integer = 0 To length - 1
            space_filled(i, 0) = start_point(0)
            space_filled(i, 1) = start_point(1) + i
        Next
    End If
End Sub

Public Sub DefineFilled()
    For i As Integer = 0 To length - 1
        x = space_filled(i, 0)
        y = space_filled(i, 1)
        Try
            generate = False
            Main.TrackerBoard.box_list(x, y).full = True
        Catch
        End Try
    Next
End Sub
Private Sub ColorFilled()
    For y As Integer = 0 To 9
        For x As Integer = 0 To 9
            'Debug.Print(Main.PlayerBoard.box_list(x, y).full)
            If Main.TrackerBoard.box_list(x, y).full = True Then 'New error: "InvalidOperationException"
                Main.TrackerBoard.box_list(x, y).image.BackColor = System.Drawing.Color.Red
            Else
                Main.TrackerBoard.box_list(x, y).image.BackColor = System.Drawing.Color.Silver 'Most often, the error appears here.


            End If
        Next
    Next
End Sub

Here is the ship class. I've taken out most of the methods to save space; if you want to see anything, I'll add it in for you.

Public Class Ship
    Dim _name As String
    Public Property name() As String ...

    Dim WithEvents _image As PictureBox
    Public Property image() As PictureBox ...

    Dim _length As Integer
    Public Property length() As Integer ...

    Dim _direction As String
    Public Property direction() As String ...

    Dim _selected As Boolean
    Public Property selected() As Boolean ...

    Dim _placed As Boolean
    Public Property placed() As Boolean ...

    Dim _location() As Integer = {0, 0}
    Public Property location() As Integer() ...

    Dim _has_moved As Boolean
    Public Property has_moved() As Boolean ...

    Dim _space_filled(,) As Integer
    Public Property space_filled() As Integer(,) ...

    Public rect As System.Drawing.Rectangle

    Dim mouse_up As Boolean = False
    Dim tile_size As Integer = 25

    Public Sub New(ByVal namep As String, ByVal imagep As PictureBox, ByVal lengthp As Integer, ByVal directionp As String, ByVal selectedp As Boolean, ByVal placedp As Boolean)
        name = namep
        image = imagep
        length = lengthp
        direction = directionp
        selected = selectedp
        placed = placedp

        location(0) = 0
        location(1) = 0

        ReDim space_filled(length, 2)
        rect = New System.Drawing.Rectangle(location(0), location(1), length * tile_size, 1 * tile_size)

    End Sub

    Private Sub Ship_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _image.MouseMove ...

    Private Sub Ships_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _image.MouseClick ...

    Private Sub Ship_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _image.MouseUp ...


    Public Sub Update() ...


    Public Sub SnapToBox() ...


    Private Sub DefineSpaceFilled() ...


    Private Sub ColorFilled() ...

End Class

Upvotes: 0

Views: 99

Answers (1)

Greg Hewgill
Greg Hewgill

Reputation: 992995

Your CheckForCollision_Enemy calls New Enemy, and New Enemy calls CheckForCollision_Enemy. You are recursing until the stack overflows.

Upvotes: 3

Related Questions