Fase 6 – Relatórios e Estatísticas (Polimorfismo e Laços) A diretoria da universidade deseja relatórios automatizados. Você deve implementar relatórios que funcionem de forma genérica para diferentes entidades. Desafio: Criar um método polimórfico gerarRelatorio() em Aluno, Professor e Curso. Exibir informações personalizadas em cada relatório. Implementar um menu para gerar relatórios múltiplos em sequência. Fase […]
Fase 7 – Arquitetura em Camadas (Boa Prática de Projeto) Seu Tech Lead pede que você estruture o sistema de forma mais profissional, separando responsabilidades. Desafio: Organizar o projeto em pacotes: model (entidades). service (regras de negócio). repository (armazenamento temporário em listas). ui (menu interativo). Criar uma classe Main que faça a integração entre as […]
Fase Final – Sistema Educacional Consolidado Chegou o grande momento! A EduConnect vai apresentar o protótipo a investidores e precisa do sistema completo. Desafio: Consolidar todas as funcionalidades. Criar um menu interativo que permita: Cadastrar alunos, professores e cursos. Criar turmas e associar alunos/professores. Registrar avaliações. Gerar relatórios gerais. Testar cenários de sucesso e falha. […]
O desenvolvimento de sistemas envolve lidar com uma série de situações inesperadas que podem comprometer a execução normal de uma aplicação. Em um cenário simples, como um programa de cadastro de produtos, o usuário pode fornecer uma entrada incorreta ao digitar letras em vez de números no campo destinado ao preço. Esse tipo de falha, […]
A linguagem Java, ao longo de sua evolução, incorporou um modelo robusto para o tratamento de exceções, possibilitando que erros sejam capturados e tratados de maneira controlada. Esse mecanismo é baseado em blocos como try, catch e finally, que permitem definir pontos de verificação e de recuperação dentro do código. Dessa forma, em vez de […]
Em sistemas distribuídos e aplicações que dependem de integrações externas, como conexões com bancos de dados ou serviços via rede, a ocorrência de erros é praticamente inevitável. Uma conexão pode ser interrompida por instabilidade na internet, um arquivo pode estar ausente no momento da leitura ou um valor numérico pode ultrapassar os limites esperados. Nesses […]
Outro ponto importante está na separação entre o fluxo normal do programa e o fluxo de tratamento de erros. Sem um mecanismo estruturado, o desenvolvedor precisaria inserir múltiplas verificações condicionais em diversas partes do código, tornando-o confuso e de difícil manutenção. O modelo de exceções de Java, ao contrário, centraliza e organiza o tratamento, permitindo […]
Além da captura e tratamento direto, a linguagem também oferece o mecanismo de propagação de exceções, utilizando a palavra-chave throws. Isso significa que, em determinadas situações, o método que detecta o erro pode não ser o mais apropriado para resolvê-lo, delegando essa responsabilidade para métodos de níveis superiores. Essa propagação é útil, por exemplo, em […]
Um exemplo prático está na leitura de arquivos. Um método que tenta abrir um arquivo inexistente pode lançar uma exceção FileNotFoundException. Caso esse método esteja em um módulo de acesso a dados, talvez ele não deva decidir o que fazer diante dessa falha, mas apenas notificar a camada superior por meio da propagação. Assim, o […]
Outro aspecto essencial é a possibilidade de criação de exceções personalizadas. Muitas vezes, as exceções oferecidas pela biblioteca padrão de Java não são suficientes para expressar problemas específicos de um domínio de negócio. Imagine, por exemplo, um sistema bancário em que uma tentativa de saque ultrapassa o saldo disponível. Embora fosse possível lançar uma exceção […]
