• Home

    Escolha seu Plano

    Carreiras Alura

    Evolua com profundidade técnica, direção clara e aplicação prática.

    Jornadas guiadas do básico ao avançado com checkpoints práticos, desenhadas para quem busca profundidade e protagonismo técnico.

    Iniciante

    Comece do zero com uma trilha clara e progressiva.

    Fundamentos práticos para dar os primeiros passos com segurança e construir uma base sólida.

    Intermediário

    Continue sua evolução com cursos que conectam fundamentos, ferramentas e prática profissional. Ganhe autonomia, e avance para projetos mais completos.

    Avançado

    Aprofunde temas técnicos e estratégicos para enfrentar desafios mais complexos. Explore boas práticas, arquitetura, performance com visão profissional.

    Cursos

    Ver mais cursos de Back-end
    • Pensamento computacional: fundamentos da computação e lógica de programação
    • Lógica de programação: mergulhe em programação com JavaScript
    • DDD: fundamentos do design orientado a domínio
    • ASP.NET: autenticação e autorização em APIs e aplicações web
    • Microsserviços: migração de monólitos e modularização

    Cursos

    Ver mais cursos de Dados
    • Python para Dados: primeiros passos
    • Excel: domine o editor de planilhas
    • Engenharia de Dados: Orquestração de Pipelines com Apache Airflow
    • Power BI Desktop: construindo meu primeiro dashboard
    • Governança e Arquitetura de Dados

    Cursos

    Ver mais cursos de Inteligência Artificial
    • IA: Explorando o Potencial da Inteligência Artificial Generativa
    • Engenharia de Prompt: Criando Prompts Eficazes para IA Generativa
    • Claude para Análise de Dados: prompts, integrações e automações
    • Agno: criando agentes e sistemas multiagente
    • Engenharia de software na era da IA: segurança de aplicações com agentes, MCPs e código gerado por IA

    Cursos

    Ver mais cursos de Front-end
    • HTML e CSS: ambiente, estrutura e estilo
    • React: realizando testes avançados com Jest e Testing Library
    • React: integrando TypeScript em projetos
    • JavaScript: aprendendo a programar
    • React: aplicando arquiteturas de Micro frontends

    Cursos

    Ver mais cursos de DevOps
    • Sistema Operacional Linux: fundamentos e administração prática
    • Containers e Docker: empacotamento, isolamento e gestão
    • Redes: dos conceitos iniciais à criação de uma intranet
    • Linux: gerenciando diretórios, arquivos, permissões e processos
    • Cibersegurança: Fundamentos e práticas integradas

    Cursos

    Ver mais cursos de UX & Design
    • UX Research: mapeando a experiência da pessoa usuária
    • UX/UI Design: Entregando produtos digitais com IA
    • UI Design: Prototipação e animações interativas
    • Figma: Conhecendo o programa
    • Product Design: métricas e ciclo de vida do produto

    Cursos

    Ver mais cursos de Gestão & Negócios
    • Canva: Criação de landing pages e e-mail marketing
    • Agilidade: como ela pode ajudar a criar um time de alta performance
    • Google Analytics 4: Extrair insights e configurar eventos
    • Management 3.0: gerencie o ambiente, não as pessoas
    • Automação de processos com n8n: Inteligência de dados para Marketing

    Cursos

    Ver mais cursos de Mobile
    • React Native: Estilização e Layouts com Flexbox e StyleSheet
    • Flutter: Graphql e suporte offline
    • Android com Gemini: Trabalhando com textos e imagens na IA
    • Dart: trabalhando com orientação a objetos
    • React Native: Dominando Listas com FlatList e ScrollView

    Carreiras

    Ver mais carreiras
    • Especialista em IA
    • Engenharia de IA
    • Ai native software engineering
    • Arquitetura de Soluções com IA
    • AI Product Design
    • Engenharia de Machine Learning
    • Desenvolvimento Front-End React
    • Engenharia de Dados
    • Cloud Security
    • Social Media Marketing
    • Engenharia de Agentes de IA

    Cursos

    • Engenharia de Prompt: Prompts Eficazes para IA Generativa
    • Claude Code: Criando sua Primeira Aplicação
    • Python: Crie sua Primeira Aplicação
    • Git e GitHub: Compartilhando e Colaborando
    • N8N: Fluxos de Trabalho Avançados

    Cursos

    • Copilot Studio: Solução Multiagentes
    • Padrões de API HTTP e Modelagem de APIs
    • Python para Análise de Dados com SQL
    • Docker: Criando e Gerenciando Containers
    • Design com IA: Otimizando o Processo Criativo

    Cursos

    • Model Context Protocol (MCP)
    • Spec-Driven Development: Dev Assistido por Agentes
    • Arquitetura de Sistemas Distribuídos com Java
    • Governança de Modelos e Reprodutibilidade
    • Pentest: Vulnerabilidades em Aplicações Web

    Escolha seu Plano

    Skills & Go

    O Skills & Go é para Tech Leads, Product Managers, estrategistas e early adopters que transformam ideias em soluções de alto impacto. Em cursos ao vivo e 100% online, você domina a nova era da IA em tempo real.

    Aulas ao vivo

    Saiba mais
    • Agentic Engineering: orquestre múltiplos agentes com confiabilidade
    • Building AI Products: transforme ideias em produtos reais com IA
    • AI Data Strategy: transforme dados em decisões estratégicas com IA

    Escolha seu Plano

    Eventos Alura

    Nossos eventos são pensados para quem quer estar à frente das mudanças em tecnologia, IA e inovação. Em experiências presenciais, você acompanha tendências e se conecta com especialistas que estão moldando o futuro.

    Próximos eventos

    • Imersão Engenharia de Software: Dev na Era da IA
    • IA Conference
    • Alura Signals
  • Talent Lab
  • IA

    Escolha seu Plano

    Conteúdos gratuitos

    Explore conteúdos gratuitos para aprender tecnologia no seu ritmo. Encontre artigos com conteúdos técnicos para aprender na prática, notícias para acompanhar as principais tendências do mercado e o Alura Labs, com análises e reflexões de especialistas sobre tecnologia, IA e carreira.

    Conteúdos gratuitos

    • Artigos
    • Notícias
    • Alura Labs
  • Para Empresas
Ver planos
Links principais
  • Planos e Promoções
  • Links complementares do menu mobile
  • Talent lab
  • Inteligência Artificial
  • Pós Graduações
  • Para Empresas
  • Sobre a Alura
  • Grupo Alun
  • Entrar
    • Home
    • Carreiras
    • Skills & Go
    • Talent Lab
    • Inteligência Artificial
    • Pós Graduações
    • Artigos
    • Sobre a Alura
    • Grupo Alun
    LoginContato
    • LinkedIn
    • Instagram
    • YouTube
    1. Página inicial
    2. Back-end
    3. Evite NullPointerException com java.util.Optional no Java

    Evite NullPointerException com java.util.Optional no Java

    5 min5 minutos de leitura

    Alura

    5 min5 minutos de leitura

    Publicado: 29/07/2014

    Já vimos aqui no blog as principais novidades do Java 8, detalhes da nova API de datas e como aplicar algumas dessas novidades em nosso dia a dia. Mas há muito o que explorar nas diversas introduções dessa nova versão da linguagem.

    Quem nunca escreveu um código parecido com esse?

     List<Matricula> matriculas = turma.getMatriculas();
    for (Matricula matricula : matriculas) { System.out.println(matricula.getCurso().getNome()); } 
    

    Tudo parece certo, mas esse código pode ser bastante problemático. A simples ausência de algum desses valores pode resultar no tão frequente NullPointerException. Claro, você pode contornar esse problema de diversas formas, como por exemplo inicializar suas listas ou sempre verificar que os valores são diferentes de null antes de fazer qualquer operação com eles.

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Nosso código pode ficar parecido com:

     List<Matricula> matriculas = turma.getMatriculas();
    for (Matricula matricula : matriculas) { if (matricula.getCurso() != null) { System.out.println(matricula.getCurso().getNome()); } } 
    

    Nada mal, mas e os outros atributos? A quantidade de ifs perdidos pelo nosso código para fazer esse tipo de verificação só tende a aumentar, isso faz com que ele fique cada vez mais ilegível e difícil de manter. E esse nem é o pior dos problemas, esquecer de fazer uma verificação como essa é um risco muito grande... em algum momento isso vai acontecer e você receberá um NullPointerException.

    Como resolver o problema? A mais nova versão do Java nos prove uma forma muito mais interessante de representar esses atributos que podem ou não estar presentes em nosso código, utilizando o java.util.Optional.

    Você pode pensar em um Optional como uma classe que pode ou não conter um valor não nulo. Repare como fica o código da classe Matricula declarando o atributo Curso como Optional:

     public class Matricula {
    private Optional<Curso> curso = Optional.empty();
    // outros atributos, getters e setters } 
    

    Utilizamos o factory method empty para criar e inicializar o atributo com um Optional vazio. Há outras formas de se criar um Optional, você pode por exemplo utilizar seu método of:

     Optional<Curso> cursoOpcional = Optional.of(algumCurso); 
    

    Mas é importante saber que caso o valor da variável algumCurso seja null, esse código irá lançar um NullPointerException. Para evitar isso podemos utilizar o método ofNullable:

     Optional<Curso> cursoOpcional = Optional.ofNullable(algumCurso); 
    

    Agora que o método getCurso retorna um Optional, precisamos chamar seu método get para recuperar o curso que esse Optional está guardando:

     for (Matricula matricula : matriculas) { if (matricula.getCurso() != null) { System.out.println(matricula.getCurso().get().getNome()); } } 
    

    Mas dessa forma, se o curso não existir vamos receber um java.util.NoSuchElementException: No value present. Como prevenir isso? Uma das possíveis formas seria verificando se o valor desse Optional está presente, algo como:

     for (Matricula matricula : matriculas) { Optional<Curso> cursoOpcional = matricula.getCurso(); if(cursoOpcional.isPresent()) { System.out.println(cursoOpcional.get().getNome()); } } 
    

    Mas isso ainda deixa nosso código muito verboso! Que tal fazer algo como:

     for (Matricula matricula : matriculas) { matricula.getCurso() .ifPresent(c -> System.out.println(c.getNome())); } 
    

    Bem mais interessante, não acha? Esse é um dos vários métodos funcionais que essa classe possui. O método ifPresent recebe um Consumer que pode ser traduzido em uma expressão lambda c -> System.out.println(c.getNome()). Mas note que você não precisa se preocupar com nenhum desses detalhes, não importa o nome da interface funcional por traz desse código, não importa o nome de seu único método, tudo que importa nesse momento é a expressão: tenho um curso e quero imprimir seu nome.

    Se você está se perguntando, podemos sim fazer o for da maneira nova! Utilizando o já conhecido forEach:

     matriculas.forEach(m -> { m.getCurso() .ifPresent(c -> System.out.println(c.getNome())); }); 
    

    Outro método interessante da classe Optional é o orElseThrow. Caso neste contexto o curso seja obrigatório, podemos fazer algo como:

     matriculas.forEach(m -> { Curso curso = m.getCurso() .orElseThrow(IllegalArgumentException::new); }); 
    

    Quer mais? Considere que a classe Curso possui uma descrição (String). É comum escrever um código parecido com esse para mostrar a descrição ou alguma outra mensagem caso ela não esteja presente:

     matriculas.forEach(m -> { m.getCurso().ifPresent(c -> { if (c.getDescricao() != null){ System.out.println(c.getDescricao()); } else { System.out.println("sem descrição"); } }); }); 
    

    Mas agora com Optional podemos escrever da seguinte forma:

     matriculas.forEach(m -> { m.getCurso().ifPresent(c -> { System.out.println(c.getDescricao().orElse("sem descrição")); }); }); 
    

    O método orElse nos retorna o curso caso presente, ou pelo contrário o valor passado como argumento.

    Para imprimir apenas quando a descrição existir e não for vazia, poderíamos escrever um código parecido com:

     matriculas.forEach(m -> { m.getCurso() .ifPresent(c -> { Optional<String> descricao = c.getDescricao(); if (descricao.isPresent() && !descricao.get().isEmpty()) { System.out.println(descricao.get()); } }); }); 
    

    Resolvemos o problema, mas o código não está nem um pouco legível!

    Para evitar esse encadeamento desnecessário, podemos utilizar o método map para fazer uma projeção do curso para sua descrição. Isso mesmo, assim como o Stream, um Optional também possui o método map! Vamos ver o resultado:

     matriculas.forEach(m -> { Optional<Optional<String>> map = m.getCurso().map(Curso::getDescricao); }); 
    

    Pois é... o map vai nos retornar um Optional>. Ainda não é o que estamos esperando. Se você já conhece a API de Streams ou programa com alguma linguagem funcional, já deve ter pensado em uma solução. Sim, o Optional também possui o método flatMap! Utilizando esse método podemos achatar o Optional> para um Optional com a descrição:

     matriculas.forEach(m -> { Optional<String> flatMap = m.getCurso().flatMap(Curso::getDescricao); }); 
    

    Estamos quase lá. Para imprimir a descrição apenas quando ela não for vazia, podemos utilizar o método filter seguido pelo ifPresent que já conhecemos:

     matriculas.forEach(m -> { m.getCurso() .flatMap(Curso::getDescricao) .filter(d -> !d.isEmpty()) .ifPresent(System.out::println); }); 
    

    Está pronto! Muito mais interessante que a solução anterior, não acha?

    Há muito mais o que aprender sobre as novas APIs da linguagem. Você pode ver mais das novidades em nosso livro e no mais novo curso online do Alura.

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Avalie este artigo

    • Foto de rodrigo.turini

      Autor(a)

      rodrigo.turini

    Explore por tópico

    • Back-end
    • Dados
    • DevOps
    • Front-end
    • Gestão & Negócios
    • Institucionais
    • Inteligência Artificial
    • Mobile
    • UX & Design

    Leia também

    • Alura
      15/04/2007

      A Collection genérica: métodos que recebem Object

      Ler mais
    • 17/12/2019

      PHP: operação com números decimais.

      Ler mais
    • Alura
      09/01/2019

      Publicando SpringBoot e Frontend em produção

      Ler mais
    Ver mais conteúdos

    Inscreva-se em nossa Newsletter

    Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.

    Institucional

    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status
    Institucional
    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status

    A Alura

    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes
    A Alura
    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes

    Conteúdos

    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Conteúdos
    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Alura