1
resposta

[Bug] Problema Stack overflow na minha solução

Quando vou registrar uma nota aparece o erro System.StackOverflowException: 'Exception_WasThrown' na linha 14 do arquivo "Avaliacao.cs" (codigo segue) e no terminal aparece o seguinte:

Stack overflow.
Repeat 16051 times:
--------------------------------
   at ScreenSound.Modelos.Avaliacao.get_Nota()
--------------------------------
   at Program.<<Main>$>g__AvaliarUmaBanda|0_6(<>c__DisplayClass0_0 ByRef)
   at Program.<<Main>$>g__ExibirOpcoesDoMenu|0_1(<>c__DisplayClass0_0 ByRef)
   at Program.<Main>$(System.String[])

Codigo do Avaliacao.cs:

namespace ScreenSound.Modelos;

internal class Avaliacao
{
    public Avaliacao(int nota)
    {

    }

    public int Nota
    {
        get
        {
            if (Nota <= 0) return 0;
            else if (Nota >= 10) return 10;
            else return Nota;
        } 
    }

    public static Avaliacao Parse(string texto)
    {
        int nota = int.Parse(texto);
        return new Avaliacao(nota);
    }
}

Eu gostaria de saber por que isso acontece se possivel.

1 resposta

Olá Felipe. Tudo bem?

O erro System.StackOverflowException que você está enfrentando é causado por uma chamada recursiva infinita no seu código. Isso acontece porque o getter da propriedade Nota está chamando a própria propriedade Nota repetidamente, sem nunca acessar um campo subjacente para armazenar o valor.

Para resolver esse problema, você precisa criar um campo privado para armazenar o valor da nota e usá-lo dentro do getter e do setter da propriedade Nota. Aqui está uma sugestão de como você pode modificar a classe Avaliacao para corrigir o problema:

namespace ScreenSound.Modelos
{
    internal class Avaliacao
    {
        private int _nota;

        public Avaliacao(int nota)
        {
            _nota = nota;
        }

        public int Nota
        {
            get
            {
                if (_nota <= 0) return 0;
                else if (_nota >= 10) return 10;
                else return _nota;
            }
        }

        public static Avaliacao Parse(string texto)
        {
            int nota = int.Parse(texto);
            return new Avaliacao(nota);
        }
    }
}

Agora, a propriedade Nota usa o campo privado _nota para armazenar e retornar o valor da nota, evitando a chamada recursiva infinita.

Espero ter ajudado e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!