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

Olá, estou desenvolvendo um código que simula o sistema de um cinema, bem simples. Bom, mais cedo tive um problema com estouro de pilha, já solucionado. No momento, estou trabalhando na parte em que o cliente informa sua idade e ela é comparada a classificação indicativa do filme. Se for acima da classificação ele segue, se não ele recebe um aviso. Porém, consegui aplicar para o filme do Homem Aranha inicialmente, ainda estava fazendo os testes, e funcionou! Ai resolvi aplicar para todos os outros filmes do programa, “Casa Gucci” e “Eternos”, porém agora, quando vou fazer a comparação da idade, quando escolhe uma sala no Homem Aranha, ocorre este erro abaixo:

Exception in thread "main" java.lang.NoSuchMethodError: VerificarIdade.verIdade()V
        at Filme.impHaranha(Filme.java:45)
        at Sessoes.impEscolha(Sessoes.java:47)
        at ShowTime.main(ShowTime.java:31)

E quando eu coloco outro filme, por exemplo o “Eternos”, ai escolho sua sala, ele simplesmente não me leva para a parte de verificar a idade, a mesma que da erro na do “Homem Aranha”, ele simplesmente fica me voltando na escolha das salas infinitamente, a mesma coisa ocorre com o filme da “Casa Gucci”

Queria saber a solução do problema e talvez possíveis dicas de melhorar meu código, vou postar as 3 classes envolvidas no erro abaixo, valeu!:

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\n\nINFORMACOES SOBRE HOMEM ARANHA 3!!!");
System.out.println("HOMEM ARANHA 3\nClassificacao Indicativa: 12 anos\nGenero: Acao e Aventura\n\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 ACIMA:\n"));
}

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\n\n");
               vI.verIdadeHA3();
               break;

               case 2:
               System.out.println("\n2) Horario 2\n\n");
               vI.verIdadeHA3();
               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


}

//==============================================================================================================
//POLIMORFISMO

public void impCasaGucci(){
System.out.println("\n\n\nINFORMACOES SOBRE CASA GUCCI!!!");
System.out.println("CASA GUCCI\nClassificacao Indicativa: 14 anos\nGenero: Drama\n");

boolean vai = true;
int op = 0;

while(vai){

System.out.println("\n\n\nEscolha um horario e sala");
System.out.println("1) Sala 2 - 14hrs");
System.out.println("2) Sala 2 - 19hrs");
System.out.println("3) Sair");
try{
op = Integer.parseInt(entrada.entDados("\nESCOLHA UMA OPCAO ACIMA:\n"));
}

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\n\n");
               vI.verIdadeGUCCI();
               break;

               case 2:
               System.out.println("\n2) Horario 2\n\n");
               vI.verIdadeGUCCI();
               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


}

//===================================================================================================
//POLIMORFISMO

public void impEternos(){
System.out.println("\n\n\nINFORMACOES SOBRE ETERNOS!!!");
System.out.println("ETERNOS\nClassificacao Indicativa: 14 anos\nGenero: Acao, Epico\n");

boolean vai = true;
int op = 0;

while(vai){

System.out.println("\n\n\nEscolha um horario e sala");
System.out.println("1) Sala 3 - 14hrs");
System.out.println("2) Sala 3 - 19hrs");
System.out.println("3) Sair");
try{
op = Integer.parseInt(entrada.entDados("\nESCOLHA UMA OPCAO ACIMA:\n"));
}

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\n\n");
               vI.verIdadeETERNOS();
               break;

               case 2:
               System.out.println("\n2) Horario 2\n\n");
               vI.verIdadeETERNOS();
               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


}
}

Classe VerificarIdade:

public class VerificarIdade {

Entrada entrada = new Entrada();



//==============================================


public void verIdadeHA3(){

int id = 0;
id = Integer.parseInt(entrada.entDados("\n\nInforme sua idade:"));

if(id < 12){
System.out.println("\nACESSO AO FILME NÃO LIBERADO!!!\n");
}else{
System.out.println("\nACESSO AO FILME LIBERADO!!!\n");
}        
}

//=====================================================

public void verIdadeGUCCI(){
int id = 0;
id = Integer.parseInt(entrada.entDados("\n\nInforme sua idade:"));

if(id < 14){
System.out.println("\nACESSO AO FILME NÃO LIBERADO!!!\n");
}else{
System.out.println("\nACESSO AO FILME LIBERADO!!!\n");
}        
}

//=====================================================

public void verIdadeETERNOS(){
int id = 0;
id = Integer.parseInt(entrada.entDados("\n\nInforme sua idade:"));

if(id < 14){
System.out.println("\nACESSO AO FILME NÃO LIBERADO!!!\n");
}else{
System.out.println("\nACESSO AO FILME LIBERADO!!!\n");
}        
}

//=====================================================

}

Classe ShowTime:

public class ShowTime extends Cliente {

public static void main(String arg[]){

Cliente c1 = new Cliente();
Entrada entrada = new Entrada();
Sessoes s1 = new Sessoes();
VerificarIdade vI = new VerificarIdade(); 


//=================================================================

c1.setNome(entrada.entDados("Nome: "));
c1.setTelefone(Integer.parseInt(entrada.entDados("Telefone: ")));


System.out.println("\n\n>>>>>> INFORMACOES PESSOAIS <<<<<<");
System.out.println("Nome: " + c1.getNome());
System.out.println("Telefone: " + c1.getTelefone());


//============================================================

c1.impInicio();
s1.impEscolha();
vI.verIdadeHA3();
vI.verIdadeGUCCI();
vI.verIdadeETERNOS();

//======================================================

}
}

Bom a ideia do polimorfismo é formar uma hierarquia onde o nó que está acima é sempre mais genérico. O objetivo disso é evitar que você fique reescrevendo a mesma coisa sempre, como é o caso dessa sua função para verificar idade. Vou deixar aqui um exemplo, espero que ajude. Abraço!

class Filme{
	protected int idade_requerida;
	protected String titulo;
	
	// Construtor
	public Filme(int idade_requerida, String titulo){
		this.idade_requerida = idade_requerida;
		this.titulo = titulo;
	}
	
	// Funcoes genéricas
	public void verificarIdade(int idade_do_meliante){
		if (idade_requerida <= idade_do_meliante){
			System.out.println("Essa pessoa pode assistir o filme " + titulo);
		} else {
			System.out.println("Essa pessoa não pode assistir o filme " + titulo);
		}
	}
	
	public int qualIdadeRequerida(){
		return idade_requerida;
	}
}
	
class HomemAranha extends Filme{
	public HomemAranha(){
		super(12, "Homem Aranha Longe de Casa");
	}
}

class Eternos extends Filme{
	public Eternos(){
		super(12, "Os Eternos");
	}
}


// Voce pode instanciar os filmes assim
HomemAranha ha = new HomemAranha();
System.out.println(ha.qualIdadeRequerida());
ha.verificarIdade(12);

// Um filme generico tambem pode ser criado
Filme ty = new Filme(10, "Toy Story 2");
System.out.println(ty.qualIdadeRequerida());
ty.verificarIdade(5);
1 curtida

Valeu, mas da forma que meu código está, não tem solução?
E só pra eu ver se entendi, esse seu exemplo substituiria minha classe Verificar Idade?

Nesse caso sim. Não vejo necessidade de criar um classe para implementar só essa função. Mas, claro, você pode deixar ela separada; nesse caso é só você injetar o filme como dependência, exemplo:

public class Filme {
     private int classificacao = 0;
     /* resto do código */

    public int getClassificacao(){
        return classificacao;
    }
}
public class VerificarIdade {

	Entrada entrada = new Entrada();

	// Injetando o filme como dependencia
	public void verificarIdade(Filme filme){
		int id = 0;
		id = Integer.parseInt(entrada.entDados("\n\nInforme sua idade:"));
	
		// Utilizando um atributo do objeto filme para verificar
		if(id < filme.getClassificacao()){
			System.out.println("\nACESSO AO FILME NÃO LIBERADO!!!\n");
		}else{
			System.out.println("\nACESSO AO FILME LIBERADO!!!\n");
		}        
	}
}

A proposito, esse seu erro (que titula o tópico) é que em algum lugar do seu código você está tentando chamar uma função que não existe para a classe VerificarIdade, ou seja, a função VerificarIdade.verIdade().

1 curtida

Bom, tentei aplicar desta forma que você propos, eu coloco o comando “javac ShowTime.java” e não apresenta erro, quando coloco o “java ShowTime” para rodar o programa, ele apresenta este erro agora:

Exception in thread "main" java.lang.NoClassDefFoundError: Filme
        at Sessoes.<init>(Sessoes.java:11)
        at Cliente.<init>(Cliente.java:11)
        at ShowTime.main(ShowTime.java:7)
Caused by: java.lang.ClassNotFoundException: Filme
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 3 more

Não sei se apliquei oque você disse da maneira correta, peço até desculpas se for algo obvio kk, é porque faz muito tempo que não mexo com Java. Vou deixar as classes abaixo novamente, para você ver se eu apliquei corretamente. Valeu

Classe Filme:

public class Filme extends VerificarIdade{

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\n\nINFORMACOES SOBRE HOMEM ARANHA 3!!!");
System.out.println("HOMEM ARANHA 3\nClassificacao Indicativa: 12 anos\nGenero: Acao e Aventura\n\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 ACIMA:\n"));
}

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\n\n");
               vI.verificarIdade();
               break;

               case 2:
               System.out.println("\n2) Horario 2\n\n");
               vI.verificarIdade();
               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


}

//==============================================================================================================
//POLIMORFISMO

public void impCasaGucci(){
System.out.println("\n\n\nINFORMACOES SOBRE CASA GUCCI!!!");
System.out.println("CASA GUCCI\nClassificacao Indicativa: 14 anos\nGenero: Drama\n");

boolean vai = true;
int op = 0;

while(vai){

System.out.println("\n\n\nEscolha um horario e sala");
System.out.println("1) Sala 2 - 14hrs");
System.out.println("2) Sala 2 - 19hrs");
System.out.println("3) Sair");
try{
op = Integer.parseInt(entrada.entDados("\nESCOLHA UMA OPCAO ACIMA:\n"));
}

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\n\n");
               vI.verificarIdade();
               break;

               case 2:
               System.out.println("\n2) Horario 2\n\n");
               vI.verificarIdade();
               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


}

//===================================================================================================
//POLIMORFISMO

public void impEternos(){
System.out.println("\n\n\nINFORMACOES SOBRE ETERNOS!!!");
System.out.println("ETERNOS\nClassificacao Indicativa: 12 anos\nGenero: Acao, Epico\n");

boolean vai = true;
int op = 0;

while(vai){

System.out.println("\n\n\nEscolha um horario e sala");
System.out.println("1) Sala 3 - 14hrs");
System.out.println("2) Sala 3 - 19hrs");
System.out.println("3) Sair");
try{
op = Integer.parseInt(entrada.entDados("\nESCOLHA UMA OPCAO ACIMA:\n"));
}

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\n\n");
               vI.verificarIdade();
               break;

               case 2:
               System.out.println("\n2) Horario 2\n\n");
               vI.verificarIdade();
               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


}


public int getClassificacao(){
        return classificacao;
    }


}

Classe VerificarIdade:

public class VerificarIdade {

Entrada entrada = new Entrada();



//==============================================

public void verificarIdade(Filme filme){
		int id = 0;
		id = Integer.parseInt(entrada.entDados("\n\nInforme sua idade:"));
	
		
		if(id < filme.getClassificacao()){
			System.out.println("\nACESSO AO FILME NÃO LIBERADO!!!\n");
		}else{
			System.out.println("\nACESSO AO FILME LIBERADO!!!\n");
		}        
	}


//=====================================================

}

Experimenta compilar assim:

javac -classpath . *.java

E executar assim:

java -classpath . ShowTime
1 curtida

Então, agora deu esses erros aqui:

Filme.java:43: error: method verificarIdade in class VerificarIdade cannot be applied to given types;
               vI.verificarIdade();
                 ^
  required: Filme
  found: no arguments
  reason: actual and formal argument lists differ in length
Filme.java:48: error: method verificarIdade in class VerificarIdade cannot be applied to given types;
               vI.verificarIdade();
                 ^
  required: Filme
  found: no arguments
  reason: actual and formal argument lists differ in length
Filme.java:98: error: method verificarIdade in class VerificarIdade cannot be applied to given types;
               vI.verificarIdade();
                 ^
  required: Filme
  found: no arguments
  reason: actual and formal argument lists differ in length
Filme.java:103: error: method verificarIdade in class VerificarIdade cannot be applied to given types;
               vI.verificarIdade();
                 ^
  required: Filme
  found: no arguments
  reason: actual and formal argument lists differ in length
Filme.java:153: error: method verificarIdade in class VerificarIdade cannot be applied to given types;
               vI.verificarIdade();
                 ^
  required: Filme
  found: no arguments
  reason: actual and formal argument lists differ in length
Filme.java:158: error: method verificarIdade in class VerificarIdade cannot be applied to given types;
               vI.verificarIdade();
                 ^
  required: Filme
  found: no arguments
  reason: actual and formal argument lists differ in length
6 errors

Consegue traduzir para o português o que o compilador está dizendo?

Como é a assinatura do método verificarIdade, que parâmetros ele espera receber?

Como você está chamando ele dentro da classe Filme, que parâmetros está passando para ele?

1 curtida

Olha, se eu entendi, ele espera receber a classificação para comparar a idade certo? Mas eu to tentando aqui de varias formas, porém todas dão erros totalmente diferentes. Como você faria para passar?

A mensagem não fala nada em classificação.
Ela é bem clara, ela diz que é requerido um Filme e você não está passando parâmetro nenhum.

Seu método foi declarado assim:

public void verificarIdade(Filme filme)

Mas você está tentando chamar ele assim:

vI.verificarIdade();

Perceba que entre os parênteses você esqueceu de passar o objeto Filme que é para ser verificado.

O ruim é que você nunca posta o seu código, aí fica complicado tentar adivinhar como você está fazendo.

Primeiro, o que você fez não tem nada de polimorfismo. Você só criou um método diferente para cada filme, o que não é uma boa: se tiver que adicionar outro filme, você irá criar outro método (com boa parte do código repetida)? Péssima ideia (a propósito, polimorfismo é outra coisa).


Não, um Filme não é uma subclasse de VerificarIdade (um filme é um verificador de idade? Não!), não use herança onde não precisa (e principalmente onde não faz o menor sentido).

Seria melhor, inclusive, separar as responsabilidades. Um filme deveria saber a programação de todos os filmes? Talvez seja melhor ter uma classe que controla a programação, pois a classe Filme só representa um único filme. Um conjunto de filmes com horários e salas é outra coisa, e deveria ser outra classe.

Claro que a melhor forma de fazer depende dos requisitos do sistema, mas como parece ser um exercício (ou um código que você está fazendo sem ter um enunciado), então podemos tomar algumas liberdades e simplificar.

Podemos considerar que uma sala tem um filme e uma lista de horários (não estou levando em conta que diferentes dias da semana podem ter horários diferentes, pois como já disse, estou simplificando apenas para te mostrar como organizar melhor o modelo de classes). E a programação do cinema é o conjunto de todas as salas, e quem controla a interação com o usuário é a bilheteria. Sendo assim, teríamos:

import java.util.Arrays;
import java.util.List;

public class Filme {
    private String nome;
    private int classificacao;
    private List<String> generos;
    // o construtor recebe todos os dados necessários para o filme
    public Filme(String nome, int classificacao, String... generos) {
        this.nome = nome;
        this.classificacao = classificacao;
        this.generos = Arrays.asList(generos);
    }
    public int getClassificacao() {
        return classificacao;
    }
    public String getNome() {
        return nome;
    }
    public List<String> getGeneros() {
        return generos;
    }
}

Só criei getters porque uma vez criado um filme, acho que não faz sentido mudar seus dados (se mudar de nome, é outro filme, por exemplo). Não crie setters que não precisa ter…

Repare que a classe só representa um único filme. Para associar o filme a uma sala, temos a classe Sala, que possui o filme e a lista de horários:

import java.time.LocalTime;
import java.util.Arrays;
import java.util.List;

public class Sala { // uma sala tem um número, um filme e uma lista de horários
    private int numero;
    private Filme filme;
    private List<LocalTime> horarios;
    public Sala(int numero, Filme filme, LocalTime... horarios) {
        this.numero = numero;
        this.filme = filme;
        this.horarios = Arrays.asList(horarios);
    }
    public Filme getFilme() {
        return filme;
    }
    public List<LocalTime> getHorarios() {
        return horarios;
    }
    public int getNumero() {
        return numero;
    }
}

Por fim, temos a bilheteria, que exibe os filmes disponíveis (representados como uma lista de salas) e interage com o usuário:

import java.time.LocalTime;
import java.util.List;
import java.util.Scanner;

public class Bilheteria {
    private Scanner entrada;
    private List<Sala> salas;
    public Bilheteria(List<Sala> salas, Scanner entrada) {
        this.entrada = entrada;
        this.salas = salas;
    }

    private int lerInteiro(String mensagem) {
        while (true) {
            try {
                System.out.println(mensagem);
                return Integer.parseInt(entrada.nextLine());
            } catch (NumberFormatException nfe) {
                System.out.println("\nO valor da escolha deve ser um inteiro.");
            }
        }
    }

    private void mostrarFilmes() {
        System.out.println("Filmes: ");
        // faz um loop por todas as salas, assim não precisa de um método para cada filme
        for (Sala sala : this.salas) {
            Filme filme = sala.getFilme();
            System.out.printf("----------\nSala %d: %s\nClassificação Indicativa: %d anos\nGênero: %s\n",
                sala.getNumero(), filme.getNome(), filme.getClassificacao(), String.join(", ", filme.getGeneros()));
        }
    }

    private void mostrarHorarios(Sala sala) {
        System.out.printf("Horários de %s (sala %d):\n", sala.getFilme().getNome(), sala.getNumero());
        int i = 1;
        for (LocalTime horario : sala.getHorarios()) {
            System.out.printf("%d) %s\n", i, horario);
            i++;
        }
    }

    public void escolherSessao() {
        int salaEscolhida;
        while (true) {
            mostrarFilmes();
            salaEscolhida = lerInteiro("Escolha o número da sala: ");
            if (salaEscolhida <= 0 || salaEscolhida >= this.salas.size()) {
                System.out.println("Esta sala não existe");
            } else {
                break;
            }
        }
        // assumindo que a numeração das salas segue a ordem em que elas estão na lista
        Sala sala = this.salas.get(salaEscolhida - 1);

        // será que precisa mesmo de outra classe só para verificar a idade?
        int idade = lerInteiro("Digite sua idade: ");
        if (idade < sala.getFilme().getClassificacao()) {
            System.out.println("Desculpe, você não tem idade para ver esse filme");
        } else {
            LocalTime horario;
            while (true) {
                mostrarHorarios(sala);
                int h = lerInteiro("\nEscolha um horário: ");
                if (h <= 0 || h > sala.getHorarios().size()) {
                    System.out.println("Horário inválido");
                } else {
                    horario = sala.getHorarios().get(h - 1);
                    break;
                }
            }
            System.out.printf("Você escolheu %s na sessão das %s\n", sala.getFilme().getNome(), horario);
        }
    }
}

Repare que nem fiz a classe VerificarIdade, pois no fim achei desnecessária (mas claro que podemos criá-la, ver mais abaixo).

E por fim, no main criamos essas classes e o loop que fica chamando o método escolherSessao até que o usuário não queira mais ver nenhum filme:

public static void main(String[] args) {
    Scanner entrada = new Scanner(System.in);
    List<Sala> salas = Arrays.asList(
        new Sala(1, new Filme("Homem Aranha 3", 12, "Ação", "Aventura"), LocalTime.of(14, 0), LocalTime.of(19, 0)),
        new Sala(2, new Filme("Casa Gucci", 14, "Drama"), LocalTime.of(14, 0), LocalTime.of(19, 0)),
        new Sala(3, new Filme("Eternos", 14, "Ação", "Épico"), LocalTime.of(14, 0), LocalTime.of(19, 0))
    );
    Bilheteria bilheteria = new Bilheteria(salas, entrada);

    while (true) {
        bilheteria.escolherSessao();
        System.out.println("Deseja ver outro filme? (S/N) ");
        if ("n".equalsIgnoreCase(entrada.nextLine()))
            break;
    }
}

Como eu disse, se quiser mesmo criar uma classe só para verificar a idade, seria algo assim:

public class VerificadorIdade {
    public static boolean podeAssistir(Filme filme, int idade) {
        // se a idade é maior ou igual à classificação do filme, pode assistir
        return idade >= filme.getClassificacao();
    }
}

Eu prefiro assim porque a verificação só diz “sim” ou “não” (retorna um boolean true ou false), e quem chamar esse método que decide o que fazer em cada caso (imprimir uma mensagem, etc). Fica melhor porque se as mensagens ficam dentro do método, uma mudança nas mensagens afetaria todos que o usam.

E para usar, basta modificar o trecho do método escolherSessao da classe Bilheteria:

... // o resto é igual
int idade = lerInteiro("Digite sua idade: ");
if (! VerificadorIdade.podeAssistir(sala.getFilme(), idade)) {
    System.out.println("Desculpe, você não tem idade para ver esse filme");
} else {
    // o resto é igual
2 curtidas

Sem palavras amigo, ajudou muito e consegui entender o seu raciocínio. Acredito que seja anos de pratica pra chegar a ter uma lógica assim. Eu ainda não consigo pensar nas maneiras mais fáceis de desenvolver o código, vou somente seguindo o que penso kkkkk. Mas valeu demais, vai ser de grande ajuda não só pra esse exercício.