Como vc trataria o Null pointer no metodo inclui endereço?
Como vc trataria o Null pointer no metodo inclui endereço?
Olá tudo bem?
Pergunta bem interessante!
Qual propósito?
Vou lhe passar algumas abordagens para você analisar.
Eu trataria NullPointerException no método incluiEndereco de forma preventiva, não reativa.
A ideia é evitar que o null entre no fluxo inválido, em vez de cercar tudo com try/catch.
Exemplo :
public void incluiEndereco(Cliente cliente) {
String cidade = cliente.getEndereco().getCidade();
repository.salvar(cliente);
}
Aqui existem vários pontos possíveis de null:
clientecliente.getEndereco()cliente.getEndereco().getCidade()Exemplos:
public void incluiEndereco(Cliente cliente) {
Objects.requireNonNull(cliente, "Cliente não pode ser nulo");
Objects.requireNonNull(cliente.getEndereco(), "Endereço não pode ser nulo");
repository.salvar(cliente);
}
Isso falha rápido (“fail fast”) e deixa claro o motivo.
public class ClienteDTO {
@NotNull
private EnderecoDTO endereco;
}
E no controller:
@PostMapping
public ResponseEntity<?> salvar(@Valid @RequestBody ClienteDTO dto) {
service.incluiEndereco(dto);
}
Assim o método de negócio já recebe dados válidos.
cliente.getEndereco().getCidade().toUpperCase()
Prefira:
Endereco endereco = cliente.getEndereco();
if (endereco == null) {
throw new RegraNegocioException("Endereço obrigatório");
}
String cidade = endereco.getCidade();
Melhora:
Optional pode ajudar em leitura:Optional.ofNullable(cliente)
.map(Cliente::getEndereco)
.map(Endereco::getCidade)
.orElseThrow(() -> new RegraNegocioException("Cidade obrigatória"));
Mas eu evitaria excesso disso em regra de negócio porque pode ficar menos legível do que if.
try {
cliente.getEndereco().getCidade();
} catch (NullPointerException e) {
return;
}
Porque:
public class Cliente {
private final Endereco endereco;
public Cliente(Endereco endereco) {
this.endereco = Objects.requireNonNull(endereco);
}
}
Isso reduz enormemente NPE no sistema inteiro.
Estratégia prática em projetos enterprise
Ordem :
@NotNull)Objects.requireNonNull)null como estado válidoExemplo final :
public void incluiEndereco(Cliente cliente) {
Objects.requireNonNull(cliente, "Cliente é obrigatório");
Endereco endereco = Objects.requireNonNull(
cliente.getEndereco(),
"Endereço é obrigatório"
);
if (endereco.getCep() == null || endereco.getCep().isBlank()) {
throw new RegraNegocioException("CEP obrigatório");
}
repository.salvar(cliente);
}
Esse tipo de abordagem:
Finalizando, trataria o NullPointerException no método incluiEndereco de maneira preventiva e orientada ao domínio da aplicação.
A prioridade não seria “capturar o erro”, mas impedir que estados inválidos cheguem à regra de negócio.
Para isso, combinaria validações de entrada (@NotNull, Objects.requireNonNull), modelagem consistente das entidades e verificações explícitas das regras obrigatórias.
Essa abordagem torna o código mais seguro, legível e sustentável, além de facilitar manutenção, debugging e evolução do sistema.
Em projetos corporativos, evitar null desde a origem normalmente reduz muito incidentes em produção e melhora a qualidade geral da aplicação.
Analisa ai com cuidado e envia um feedback.
Bons estudos.