簡體   English   中英

引發了類型為'System.StackOverflowException'的異常。

[英]Exception of type 'System.StackOverflowException' was thrown.'

為什么這個? 這是我的代碼。 這是我的“ Kwadrat”課

public class Kwadrat : FormView
{
    public int X {get;set;}
    public int Y {get;set;}
    public Kwadrat Parent { get; set; }

    public void pozycja()
    {

        X = Parent.X;
        Y = Parent.Y;
    }

}

在這一行中,Visual Studio向我顯示一個錯誤

Kwadrat k1 = new Kwadrat();

這是FormView.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;

namespace ObjectMoving
{
public partial class FormView : Form
{
    enum Position
    {
        Left, Right, Up, Down
    };
    private int NUMBER_OF_SQUARES=20;
    private int SQUARE_SIZE=15;
    Point _start = new Point(30,30);
    private Position _objPosition;
    Kwadrat k1 = new Kwadrat();
    Kwadrat k2 = new Kwadrat();
    private Kwadrat k3 = new Kwadrat();
    List<Rectangle> Snake = new List<Rectangle>();
    Losowanie l1=new Losowanie();

    public FormView()
    {
        InitializeComponent();

        _objPosition = Position.Down;

        k1.X = 30;
        k1.Y = 60;

        k2.Parent = k1;
        k2.X = 30;
        k2.Y = 45;

        k3.Parent = k2;
        k3.X = 30;
        k3.Y = 30;
        l1.losowa();



    }

    private void FormView_Paint(object sender, PaintEventArgs e)
    {
        for (int i = 0; i <= NUMBER_OF_SQUARES; i++)
        {
            //rysowanie lini horyzontalnych
            e.Graphics.DrawLine(new Pen(Brushes.Red),
                _start.X,
                _start.Y + SQUARE_SIZE * i,
                _start.X + SQUARE_SIZE * NUMBER_OF_SQUARES,
                _start.Y + SQUARE_SIZE * i);

            //Rysowanie lini wertykalnych
            e.Graphics.DrawLine(new Pen(Brushes.Brown),
                _start.X + SQUARE_SIZE * i,
                _start.Y,
                _start.X + SQUARE_SIZE * i,
                _start.Y + SQUARE_SIZE * NUMBER_OF_SQUARES);
        }


        e.Graphics.FillRectangle((Brushes.Aqua), k1.X, k1.Y, SQUARE_SIZE,        SQUARE_SIZE);
        e.Graphics.FillRectangle((Brushes.Aqua), k2.X, k2.Y, SQUARE_SIZE, SQUARE_SIZE);

        e.Graphics.FillRectangle((Brushes.Aqua), k3.X, k3.Y, SQUARE_SIZE, SQUARE_SIZE);

        e.Graphics.FillRectangle((Brushes.Red),l1.RandomNumber, l1.RandomNumber2, SQUARE_SIZE, SQUARE_SIZE);

        //foreach (Rectangle Object in Snake)
        //{
        //    e.Graphics.FillRectangle(new SolidBrush(Color.Aqua), k3.X, k3.Y, SQUARE_SIZE, SQUARE_SIZE);
        //}




    }


    //odswiezanie
    public void tmrMoving_Tick(object sender, EventArgs e)
    {
        //kolizja();
        k3.pozycja();

        k2.pozycja();




        if (_objPosition == Position.Right)
        {



            k1.X += 15;



        }
        else if (_objPosition == Position.Left)
        {

            k1.X -= 15;
        }
        else if (_objPosition == Position.Up)
        {

            k1.Y -= 15;
        }

        else if (_objPosition == Position.Down)
        {

            k1.Y += 15;
        }
        if (k1.X < 29)
        {
            tmrMoving.Enabled = false;
            tmrMoving.Stop();
            MessageBox.Show("Wyjechales poza plansze");
            Application.Exit();

        }
        else if (k1.X > 315)
        {
            tmrMoving.Enabled = false;
            tmrMoving.Stop();
            MessageBox.Show("Wyjechales poza plansze");
            Application.Exit();

        }
        else if(k1.Y<29)
        {
            tmrMoving.Enabled = false;
            tmrMoving.Stop();
            MessageBox.Show("Wyjechales poza plansze");
            Application.Exit();

        }
        else if (k1.Y > 315)
        {
            tmrMoving.Enabled = false;
            tmrMoving.Stop();
            MessageBox.Show("Wyjechales poza plansze");
            Application.Exit();

        }

        Invalidate();
    }
    //ruch strzalkami
    private void FormView_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Left)
        {
           // s1.Sprawdzenie();           

            _objPosition = Position.Left;

        }
        else if (e.KeyCode == Keys.Right)
        {
            _objPosition = Position.Right;



        }
        else if (e.KeyCode == Keys.Up)
        {
            _objPosition = Position.Up;
        }
        else if (e.KeyCode == Keys.Down)
        {
            _objPosition = Position.Down;
        }
    }

    //public void kolizja()
    //{

    //    if (k1.X == l1.RandomNumber && k1.Y == l1.RandomNumber2)
    //    {
    //        l1.losowa();

    //        Snake.Add(new Rectangle(k3.X, k3.Y, 15, 15));

    //    }
    //}







}

}

您這里遇到的問題是“圓形參考”的味道。

您的Kwadrat類基於FormView ,這意味着每當您創建一個新的Kwadrat實例時,例如,您已經在構造k1的行上進行了Kwadrat ,這意味着將發生以下情況:

  1. 我們正在創建Kwadrat的新實例,因此讓我們調用其構造函數
  2. 它繼承自FormView ,因此讓我們調用其構造函數並設置其成員變量等。
  3. 我們在FormView ,它需要一個名為K1的Kwadrat實例,讓我們創建它

現在,我們循環回到“ 1”,然后永遠重復一次,這就是為什么您收到自己的StackOverflowException原因。 在這種情況下,我們正在查看的類包含一個名為Parent的屬性,該屬性的類型本身就是一個“紅色鯡魚”,因為這不是錯誤的原因,即使您最終遇到的是Kwadrat實例如果將Parent設置為self(例如instance.Parent = instance; ),則嘗試遍歷該實例的父級層次結構時,可能會看到相同的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM