ERRO: Exception in thread "main" java.lang.StackOverflowError

Olá, estou criando um código que simula de forma bem simples um processo em um cinema. Estou na etapa em que a pessoa escolhe o filme e o sistema precisa fazer uma comparação entre a Idade fornecida pela pessoa e a classificação indicativa do filme. Se for maior que a indicação do filme, o código segue em frente, se não ele barra o usuário com uma mensagem. Estou utilizando polimorfismo para fazer a “conversa” entre as classes, até agora foi bem, porém estou com este erro:

Exception in thread "main" java.lang.StackOverflowError
        at VerificarIdade.<init>(VerificarIdade.java:6)
        at Filme.<init>(Filme.java:10)
        at VerificarIdade.<init>(VerificarIdade.java:6)
        at Filme.<init>(Filme.java:10)
        at VerificarIdade.<init>(VerificarIdade.java:6)
        at Filme.<init>(Filme.java:10)
        at VerificarIdade.<init>(VerificarIdade.java:6)
        at Filme.<init>(Filme.java:10)
        at VerificarIdade.<init>(VerificarIdade.java:6)
        at Filme.<init>(Filme.java:10)...

Que se repete ainda mais vezes.
Tentei por enquanto aplicar a somente um filme, mas deu o erro, se eu conseguir arrumar vou aplicar para o restante tbm. Queria saber como resolver e se talvez exista uma forma mais simples de se realizar essa operação. Talvez até minha aplicação do if esteja incorreta kkk, estou BEM enferrujado no JAVA, valeu quem puder ajudar! Vou deixar as classes do ERRO abaixo!

Classe VerificarIdade:

public class VerificarIdade {
  
  Entrada entrada = new Entrada();
  Filme filme = new Filme();
  
  //==============================================
  //POLIMORFISMO
  public void verIdade() {
    int id = 0;
    id = Integer.parseInt(entrada.entDados("\nInforme sua idade:"));
    
    if (id < 12) {
      System.out.println("\nACESSO AO FILME NÃO LIBERADO!!!");
    } else {
      System.out.println("\nACESSO AO FILME LIBERADO!!!");
    }
  }
  //=====================================================
}

Classe Filme:

public class Filme {
  
  private String nomeFilme = "";
  private int classificacao = 0;
  private int horario = 0;
  
  Entrada entrada = new Entrada();
  VerificarIdade vI = new VerificarIdade();
  
  //=========================================================
  //POLIMORFISMO
  public void impHaranha() {
    System.out.println("\n\nHOMEM ARANHA 3\n Classificacao Indicativa: 12 anos\n Genero: Acao e Aventura\n");
    boolean vai = true;
    int op = 0;
    
    while (vai) {
      System.out.println("\n\n\nEscolha um horario e sala");
      System.out.println("1) Sala 1 - 14hrs");
      System.out.println("2) Sala 1 - 19hrs");
      System.out.println("3) Sair");
      
      try {
        op = Integer.parseInt(entrada.entDados("\nEscolha uma opcao"));
      } catch (NumberFormatException nfe) {
        entrada.entDados("\nO valor da escolha deve ser um inteiro. Press <Enter> para continuar");
        continue;
      }
      
      switch (op) {
        case 1:
          System.out.println("\n1) Horario 1");
          vI.verIdade();
          break;
        case 2:
          System.out.println("\n2) Horario 2");
          vI.verIdade();
          break;
        case 3:
          String resp = entrada.entDados("\nDeseja realmente sair do sistema? <s/n>");
          
          if (resp.equalsIgnoreCase("s")) {
            System.exit(0);
          }
          break;
        default:
          entrada.entDados("\nA opcao deve estar entre 1 e 3");
          break;
      }
    } // fim do while
  }
}

O problema é que vc, ao instanciar a classe VerificarIdade, uma instância de Filme está sendo criada, e quando a instância de Filme é criada, um outra instância de VerificarIdade está sendo criada. Isso está causando um loop infinito.

Não há polimorfismo no seu código.
:man_shrugging:

O problema na sua implementação é que VerificarIdade instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme
que instancia um VerificarIdade
que instancia um Filme

E assim sucessivamente até estourar a pilha de memória.

1 curtida