Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] DesafioPOO

Estou com erro:

public class Filme {
    String nome;
    int anoDeLancamento;
    int duracaoEmMinutos;
    boolean incluidoNoPlano;
    double somaDasAvaliacoes;
    int totalDeAvaliacoes;

    {
        System.out.println("Nome: " + nome);
        System.out.println("Ano de Lançamento: " + anoDeLancamento);
        System.out.println("Duração: " + duracaoEmMinutos + " minutos");
        System.out.println("Incluído no Plano: " + (incluidoNoPlano ? "Sim" : "Não"));
    }

    void avalia(double nota) {
        somaDasAvaliacoes += nota;
        totalDeAvaliacoes++;
    }

    double pegaMedia() {
        return (totalDeAvaliacoes > 0) ? somaDasAvaliacoes / totalDeAvaliacoes : 0;
    }
}

public class Main {
    public static void main(String[] args) {
        Filme meuFilme = new Filme();
        meuFilme.nome = "Mad Max";
        meuFilme.anoDeLancamento = 2014;
        meuFilme.duracaoEmMinutos = 169;
        meuFilme.incluidoNoPlano = true;

        meuFilme.exibeFichaTecnica();

        meuFilme.avalia(9.0);
        meuFilme.avalia(8.5);
        meuFilme.avalia(10.0);

        System.out.println("Média das avaliações: " + meuFilme.pegaMedia());
    }
}
1 resposta
solução!

Oi, André! Como vai?

O seu código tá muito bem estruturado e você tá no caminho certo para aplicar a orientação a objetos. O erro que você está enfrentando é um erro de compilação na sua classe Main e acontece por um detalhe na definição da sua classe Filme.

Na classe Main, você chama o método meuFilme.exibeFichaTecnica().

No entanto, na sua classe Filme, você não criou um método com esse nome. Você criou um bloco de inicialização.

Vamos olhar a diferença:

O seu código na classe Filme:

// ... atributos ...

    // Isto é um Bloco de Inicialização
    {
        System.out.println("Nome: " + nome);
        System.out.println("Ano de Lançamento: " + anoDeLancamento);
        System.out.println("Duração: " + duracaoEmMinutos + " minutos");
        System.out.println("Incluído no Plano: " + (incluidoNoPlano ? "Sim" : "Não"));
    }

    void avalia(double nota) {
    //...

Esse bloco de código (apenas com {}) é executado automaticamente toda vez que um new Filme() é chamado, antes mesmo de você atribuir os valores (como "Mad Max" ou 2014).

O que você queria fazer era criar um método (uma ação) que pudesse ser chamado depois de definir os valores.

A correção:

Você precisa dar um nome a esse bloco, transformando-o no método exibeFichaTecnica que a classe Main espera encontrar.

Altere o código da classe Filme para isto:

public class Filme {
    String nome;
    int anoDeLancamento;
    int duracaoEmMinutos;
    boolean incluidoNoPlano;
    double somaDasAvaliacoes;
    int totalDeAvaliacoes;

    // Correção: Adicione a assinatura do método "void exibeFichaTecnica()"
    void exibeFichaTecnica() {
        System.out.println("Nome: " + nome);
        System.out.println("Ano de Lançamento: " + anoDeLancamento);
        System.out.println("Duração: " + duracaoEmMinutos + " minutos");
        System.out.println("Incluído no Plano: " + (incluidoNoPlano ? "Sim" : "Não"));
    }

    void avalia(double nota) {
        somaDasAvaliacoes += nota;
        totalDeAvaliacoes++;
    }

    double pegaMedia() {
        return (totalDeAvaliacoes > 0) ? somaDasAvaliacoes / totalDeAvaliacoes : 0;
    }
}

Ao fazer essa mudança, a sua classe Main conseguirá encontrar e executar o método exibeFichaTecnica() no momento certo (depois que os atributos nome, anoDeLancamento, etc., já foram preenchidos), e seu código funcionará como esperado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!