728x90
반응형
상황
영수증 출력 화면을 수정해야 한다.
배달 방식 중에서 '배민원 또는 쿠팡이츠'라면 영수증에 '배민원' 또는 '쿠팡이츠'라고 표시해줘야 한다.
배달 방식 중 '배민원 또는 쿠팡이츠'가 아닌 나머지 방식들은 영수증에 아무런 표기를 하지 않는다.
해당 코드를 작성하고 프로그램을 실행해보니 아래와 같은 에러가 발생했다.
에러 메시지
java.lang.NullPointerException
1. 원인
배달 방식 중 '배민원' 또는 '쿠팡이츠'가 아닌 나머지 방식들은
DB의 해당 컬럼에 NULL이거나 다른 데이터가 저장되어 있는 경우이다.
나는 이때, 배달 방식이 저장되는 컬럼 값 중에서 NULL인 경우를 생각하지 못했기 때문에
NullPointerException이 발생한 것이었다.
2. 해결
이를 해결하기 위해서는 예외 처리를 해주어야 한다.
기존 코드
if ((dtoOrderInfo.getDTId().equals("BAEMIN") && dtoOrderInfo.getDTIdDetail() != null && dtoOrderInfo.getDTIdDetail().contains("B1"))
|| dtoOrderInfo.getDTId().equals("CPEATS")) {}
이 코드의 경우에는 DTTdDetail 컬럼이 null이 아닌 경우여야 한다는 조건을 잘 작성했지만
DTId 컬럼이 null이 아닌 경우는 조건이 아니므로 NullPointerException이 발생할 가능성이 있는 코드이다.
수정 코드
if (dtoOrderInfo != null) {
// dtoOrderInfo가 null이 아니므로 안전하게 메서드 호출 가능
if ((dtoOrderInfo.getDTId() != null && dtoOrderInfo.getDTId().equals("BAEMIN") && dtoOrderInfo.getDTIdDetail() != null && dtoOrderInfo.getDTIdDetail().contains("B1")) ||
(dtoOrderInfo.getDTId() != null && dtoOrderInfo.getDTId().equals("CPEATS"))) {}
- 'dtoOrderInfo != null' 조건으로 dtoOrderInfo 객체가 null인지 확인한다.
- dtoOrderInfo 객체가 유효한지 확인하고 NullPointerException을 방지하기 위해 사용한다.
- 해당 테이블의 모든 컬럼 데이터가 다 채워져야 한다는 의미는 아니다. 단지, dtoOrderInfo 객체 자체가 유효한지 확인하는 것이다.
- 만약 dtoOrderInfo가 null이라면, 해당 객체의 메서드를 호출할 수 없기 때문에 이후의 조건 검사도 무의미해지기 때문이다.
- 'dtoOrderInfo.getDTId() != null' 조건으로 DTTd 컬럼이 null이 아닌지 확인한다.
728x90
반응형
'[Project] > 업무일지' 카테고리의 다른 글
[Java] java.awt.print.PrinterAbortException (0) | 2024.08.07 |
---|---|
[Java] java.lang.NoSuchMethodException (0) | 2024.08.06 |
[Java/JavaSwing] 라벨 출력 시 메모 영역 내 공백 출력 방식 수정 (0) | 2024.07.30 |
[Java/JavaSwing] POS 시스템 내 MakeLine 범핑 옵션기능 추가 (0) | 2024.07.29 |
java.sql.SQLException: Illegal mix of collations (euckr_korean_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '=' (0) | 2024.07.26 |