BackEnd/Java

java.lang.nullpointerexception 오류

꾹꾹이 2022. 2. 27.
728x90

JAVA, C를 이용하여 개발하다 보면

java.lang.nullpointerexception 오류가 적잖이 발생한다.

 

널 어쩌구 하는 걸 보니 뭔가 빠졌다는 것 같은데.,,

 원인은 간단하다.

 

원인: 객체 생성 후 인스턴스를 생성하지 않은 상태에서 NULL 오브젝트를 사용해서 발생

 

해결방법은 여러 가지이다.

 

1. 방어 코드 사용

try~catch를 사용하여 java.lang.nullpointerexception을 예외 처리하고 null인지 아닌지 비교할 수도 있다.

 

 

2.null Parameter를 넘기지 말자.

 

뒷단에서 방어 코드를 짜 놓는다고 하더라도 "의미 없는 NULL"은 파라미터로 넘기지 말자.

예를 들어 size라는 변수를 null로 선언을 한 뒤 문자의 길이를 받아온 뒤 연산을 하는 로직을 만들었다.

1
2
3
4
5
int Size = null;
...
Size = paramcode.size();
 
result = (int) total/Size;
cs

여기서 paramcode의 값이 없는 경우 에러가 null 에러가 발생할 수 있다.

 

 

3. null 여부 비교 처리하기

 

흔하게 사용되는 방식이다. 나도 자바 코딩할 때면 굉장히 자주 사용한다.

선언한 변수가 null인지 체크를 해주면 된다.

1
2
3
4
5
6
7
8
9
10
int Size = null;
...
 
if(Size != null){
    Size = paramcode.size();
}else{
    return;
 
 
result = (int) total/Size;
cs

위의 예시를 이어서 설명하면, Size 변수가 null인지 검사를 하고 로직이 넘어가도록 해주는 것이다.

 

 

4. 문자열 비교 시 equals를 먼저 사용하기

 

String 문자열은 기본형이 아니다. 객체이기 때문에 문자열 비교를 위해 "equals"메서드를 사용한다.

그런데 문자열에 null 값이 들어온 경우 equals 메서드를 찾을 수 없기 때문에 null 에러가 발생하게 된다.

아래는 안 좋은 예이다.

1
2
3
4
5
6
7
String name = param.get("NAME");
 
if(!name.equals("")){
    System.out.println("성공");
}else{
    System.out.println("실패");
}
cs

 

name이라는 변수가 null인데 equals 메서드를 호출하려고 하니 에러가 발생하는 것이다.

아래는 좋은 예이다.

1
2
3
4
5
6
7
String name = param.get("NAME");
 
if(name == "이름"){
    System.out.println("성공");
}else{
    System.out.println("실패");
}
cs

 

1
2
3
4
5
6
7
String name = param.get("NAME");
 
if("이름".equals(name)){
    System.out.println("성공");
}else{
    System.out.println("실패");
}
cs

 

equals 메서드의 순서를 바꾸어 주는 것만으로도 간단히 해결할 수 있다.

 

5. toString() 대신 valueOf() 사용하기
1
2
System.out.println(name.toString());    //null 에러 발생
System.out.println(String.valueOf(name))://'null' 출력
cs

 

6. @NotNull, @NotEmpty, @NotBlank 사용하기

 

spring을 사용하고 있다면 어노테이션을 사용하자!

 

 

 

 

 

참조:https://goddaehee.tistory.com/126

댓글