java.lang.NullPointerException
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1001)
at com.cbssports.nflapp.ffb.ui.FragmentPendingTrades$PendingTradesAdapter.getView(...)
堆疊顯示在 ListView 滾動時 (AbsListView$FlingRunnable) 觸發。
String size = parser.getValue(e, parser.KEY_FileSizeInByte); // 實際是日期字串 "20130310"
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
try {
Date parsed = format.parse(pendingTrade.voteDeadline); // 關鍵:voteDeadline 可能為 null
holder.deadline.setText("Deadline | " + NEWS_DATE_FORMAT.format(parsed));
} catch (ParseException pe) {
Log.e("ERROR", "Cannot parse: " + pendingTrade.voteDeadline);
}
pendingTrade.voteDeadline 為 null,傳給 SimpleDateFormat.parse(null) 直接拋出 NullPointerException(而非 ParseException),導致 App 崩潰。
String deadlineStr = pendingTrade.voteDeadline;
if (TextUtils.isEmpty(deadlineStr)) {
holder.deadline.setText("Deadline | N/A");
return;
}
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
Date parsed = format.parse(deadlineStr);
holder.deadline.setText("Deadline | " + NEWS_DATE_FORMAT.format(parsed));
} catch (ParseException e) {
Log.e(TAG, "日期解析失敗: " + deadlineStr, e);
holder.deadline.setText("Deadline | Invalid");
}
ThreadLocal 或每次新建(輕量場景可接受)// 現代寫法
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
try {
LocalDate date = LocalDate.parse(deadlineStr, formatter);
holder.deadline.setText("Deadline | " + date.format(DateTimeFormatter.ofPattern("MMM dd, yyyy")));
} catch (DateTimeParseException e) {
// 處理異常
}
DateUtils.parseDeadline(String) 返回 LocalDate 或格式化後字串| 錯誤模式 | 後果 | 修正 |
|---|---|---|
| parse(null) | NPE 崩潰 | 前置非空判斷 |
| SimpleDateFormat 為成員變數多線程共用 | 數據錯亂/崩潰 | ThreadLocal / 局部新建 / java.time |
| catch 只捕獲 ParseException | 漏捕 NPE | catch (Exception) 或前置校驗 |
| Locale 未指定 | 某些語言環境下解析失敗 | Locale.US / Locale.getDefault() |