none
System.StackOverflowException RRS feed

  • Pergunta

  • Tenho um relacionamento de duas classes, onde a classe "Aluno" gera um "Usuario" 

    o construtor do aluno está assim:

    public Aluno()
    {
    aluno_Usuario = new Usuario();
    }

    e do Usuario:

    public Usuario()
    {
    usuario_Aluno = new Aluno();
    }

    Quando chego no construtor da classe aluno recebo o erro System.StackOverflowExcpetiom, poderiam me ajudar nisso?

    quarta-feira, 17 de agosto de 2016 17:11

Respostas

  • Olá Junior,

    Está dando estouro de pilha, pois você está em loop.

    Para você compreender, o que seu código está fazendo quando criamos um novo usuário, por exemplo:

    1) Entra no construtor Usuario()

    2) Chama o construtor Aluno()

    3) Entra no construtor Aluno()

    4) Chama o construtor Usuario()

    5) A partir daqui ele repete o passo 1 e por consequência todos os outros

    Resumindo, um construtor está chamando o outro e isso torna-se uma referência circular que nunca acaba.

    Você não pode fazer dessa maneira. Pelo menos um dos construtores não deve chamar o outro, por exemplo. Ao cadastrar o Aluno você criará um usuário, então faz assim:

    public Aluno()
    {
       aluno_Usuario = new Usuario();
    }
    
    public Usuario()
    {
       
    }
    Não precisa fazer o caminho inverso também

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco




    • Editado André SeccoMVP quarta-feira, 17 de agosto de 2016 17:26
    • Marcado como Resposta JuniorTunjr quarta-feira, 17 de agosto de 2016 17:33
    quarta-feira, 17 de agosto de 2016 17:21
  • Acabei de editar minha resposta dando um exemplo de como fazer. Você não precisa criar dois objetos, um apontando para o outro. Cria apenas um:

    public Aluno()
    {
       aluno_Usuario = new Usuario();
    }
    
    public Usuario()
    {
       
    }


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    • Marcado como Resposta JuniorTunjr quarta-feira, 17 de agosto de 2016 17:33
    quarta-feira, 17 de agosto de 2016 17:29

Todas as Respostas

  • A classe aluno carrega a classe usuário e a classe usuário carrega a classe aluno, criando chamadas de métodos aninhados, isto gera um loop infinito, você não pode fazer isso.

    Se a resposta contribuiu com seu aprendizado por favor marque como Útil
    Se solucionou seu problema por favor marque como Resposta
    Atenção, se seu problema foi resolvido não deixe o post aberto 

    Visite : www.codigoexpresso.com.br

    • Sugerido como Resposta Luiz Joli quarta-feira, 17 de agosto de 2016 18:08
    quarta-feira, 17 de agosto de 2016 17:20
  • Olá Junior,

    Está dando estouro de pilha, pois você está em loop.

    Para você compreender, o que seu código está fazendo quando criamos um novo usuário, por exemplo:

    1) Entra no construtor Usuario()

    2) Chama o construtor Aluno()

    3) Entra no construtor Aluno()

    4) Chama o construtor Usuario()

    5) A partir daqui ele repete o passo 1 e por consequência todos os outros

    Resumindo, um construtor está chamando o outro e isso torna-se uma referência circular que nunca acaba.

    Você não pode fazer dessa maneira. Pelo menos um dos construtores não deve chamar o outro, por exemplo. Ao cadastrar o Aluno você criará um usuário, então faz assim:

    public Aluno()
    {
       aluno_Usuario = new Usuario();
    }
    
    public Usuario()
    {
       
    }
    Não precisa fazer o caminho inverso também

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco




    • Editado André SeccoMVP quarta-feira, 17 de agosto de 2016 17:26
    • Marcado como Resposta JuniorTunjr quarta-feira, 17 de agosto de 2016 17:33
    quarta-feira, 17 de agosto de 2016 17:21
  • Esperava que fosse exatamente isso, é um problema com resposta na cara mas foi bom para esclarecer, de alguma forma posso resolver este problema?
    quarta-feira, 17 de agosto de 2016 17:27
  • Acabei de editar minha resposta dando um exemplo de como fazer. Você não precisa criar dois objetos, um apontando para o outro. Cria apenas um:

    public Aluno()
    {
       aluno_Usuario = new Usuario();
    }
    
    public Usuario()
    {
       
    }


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    • Marcado como Resposta JuniorTunjr quarta-feira, 17 de agosto de 2016 17:33
    quarta-feira, 17 de agosto de 2016 17:29