How to Prevent Java NPEs: Real‑World Debugging and Defensive Coding Tips
This article walks through a real production NPE incident in a Java backend, reproduces the faulty code, analyzes each null‑pointer cause, and presents defensive programming, ternary, Optional, and utility‑library solutions while recommending SonarLint for automatic detection.
1. Introduction
The company hired a junior Java developer, assigned a small iteration, and the task was to pull third‑party data, match it to internal channels, aggregate into a list, and batch‑insert into the database.
2. Reproducing the Incident
Pseudocode
说明 : The pseudocode is not the actual production code but helps to recreate the incident; the real business logic is more complex, and NPEs often hide deep in the code.
String channelNo = channelDao.getOne().getChannelNo();
List<ThirdData> thirdDataList = httpClientUtils.getThirdDatas(DateUtils.today());
thirdDataList.stream().filter(o -> channelNo.equals(o.getChannelNo())).collect(Collectors.toList());
thirdDataDao.saveAll(thirdDataList);Analysis and Solution
Experienced developers can spot three NPEs hidden in the four lines of code.
First line analysis
If channelDao.getOne() returns null, calling getChannelNo() throws an NPE.
Solution
1. Defensive programming – early return
Channel channel = channelDao.getOne();
if (channel == null) {
return;
}2. Ternary operator returning empty string
String channelNo = channelDao.getOne() == null ? "" : channelDao.getOne().getChannelNo();3. Using Optional
String channelNo = Optional.ofNullable(channelDao.getOne()).orElse("");Third line analysis (1)
If thirdDataList is null, calling stream() throws an NPE.
1. Defensive programming – collection null check (recommended)
if (CollectionUtils.isEmpty(thirdDataList)) {
return;
}2. Wrap with if (not recommended)
if (CollectionUtils.isNotEmpty(thirdDataList)) {
// execute subsequent logic
}Third line analysis (2)
If channelNo is null, the expression channelNo.equals(o.getChannelNo()) throws an NPE.
1. Add explicit null check
channelNo != null && channelNo.equals(o.getChannelNo())2. Use Objects.equals from java.util
Objects.equals(channelNo, o.getChannelNo())3. Use utility libraries such as Apache Commons StringUtils or Hutool StrUtil
These libraries provide null‑safe string comparison methods.
3. Final Recommendation
The author recommends the IDEA plugin SonarLint (and its server counterpart SonarQube ) to dynamically detect code risks like NPEs during development.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Programmer DD
A tinkering programmer and author of "Spring Cloud Microservices in Action"
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
