기능 중에 GameObject의 이름이 서로 일치하는지 비교하는 코드가 있었다.
문제는 이 기능이 매 프레임마다 작동하는 기능인데 equals() 메서드를 사용하는 바람에
우연히 마우스가 포인트가 잡히지 않는 곳을 향하면 NullPointerException을 띄우며 강제종료 된다.....
5번 중 3번은 이것 때문에 강종될 정도였음.
일단 다른 기능이 급해서 나중에 예외처리 해야지~ 하고 넘겼는데
오늘! 코드를 고치기로 결심하고 예외처리를 찾아보던 중 아예 널 오류를 안 띄우는 방법이 있다고 해서 적용해보았다.
아래는 원래 코드이다.
GameObject target, art
if (target.equals(art)) {
artPanel.panelStart();
artPanel.changeImg(gameObject);
}
equals 메서드 사용시 NullPointerException이 뜨는 이유
해결하기 전 원리를 알면 백전백승이 아닐까?
equals 메서드는 주로 문자열을 비교할 때 쓰는 메서드이다.
하지만 equals.() 를 부르는 인스턴스가 null 이라면 NullPointerException이 발생하게 된다.
String a = null;
if (a.equals("A")){ //NullPointerException 발생
//기능
}
예시 코드를 작성해 보았다...
위처럼 a가 null 인데 equals를 호출하는 상황이 생겨서 NullPointerException이 뜨는 것이다.
내 경우가 진짜 이랬다. 거의 유레카 외칠 뻔.
나는 target에 매 프레임마다 마우스 커서가 위치한 오브젝트를 넣어주고 있었는데,
마우스 커서가 존재하지 않는 오브젝트(무슨 시공간의 구멍도 아니고)를 우연히 향하면 target에 null 값이 들어가서 NullPointerException이 뜨는 거다.....
해결 방법에는 여러가지가 있다.
- 인스턴스의 null 여부를 체크한 후 equals 호출
- 비교할 문자열이 equals메서드를 호출
- equals 없애고 다른 방법 사용하기 (???)
아래에서 더 자세하게 살펴보자.
1. 인스턴스의 null 여부를 체크한 후 equals 호출
내가 생각한 예외처리가 이거였다.
GameObject a = null;
public GameObject b; //null이 아니라고 가정
if(a!=null){
if (a.equals(b)){
//기능
}
}
쏘 간단.
2. 비교할 문자열(GameObjcet)가 equals 메서드를 호출
일단 방법은 아래와 같다.
GameObject a = null;
public GameObject b; //null이 아니라고 가정
if (b.equals(a)){
//기능
}
비교하려는 문자열을 앞에 두고 역으로 equals 메서드를 호출하는 것이다.
이러면 if (false)가 되어서 동작하지 않는다.
3. equals 없애고 다른 방법 사용하기 (???)
ㅋㅋ.. 무식해보이는데 이걸 썼다. 오류가 나면 오류가 나게 하는 걸 없애야지
사실 이건 내가 equals() 메서드로 GameObject를 비교했기 때문에 사용할 수 있는 방법이었다.
아니 그니까 왜 문자열 비교하는 equals() 메서드로 GameObject를 비교하냐고...
아마도 유니티 초기라서 그땐 '오브젝트 이름을 비교하는 거니까 == 는 좀 그렇고 equals를 써야하지 않을까?!' 했던 것 같다.
GameObject a = null;
public GameObject b; //null이 아니라고 가정
if (a==b){
//기능
}
그렇다. 그냥 == 기호 써줬다.
다시 말하지만 문자열이 아니라 GameObject였기 때문에 가능한 일 !!
에러가 해결되어서 마음이 편한데 조금 슬프다.
나 왜 그렇게 코드 짰었ㄴㅣ.....^^...
'Coding > Unity' 카테고리의 다른 글
[Unity] 빌드 시 exe 파일이 추출되지 않을 때 (0) | 2022.09.19 |
---|---|
[Unity] 파일 탐색기 불러오기/파일 선택 (0) | 2022.08.20 |
[Unity] GameObject 배열 생성 / 자식 오브젝트를 배열에 넣기 / UI 상태에 따라 기능 동작 결정 / NullReferenceException 해결 (1) | 2022.04.19 |
[Unity] 비활성화 상태의 자식 오브젝트 찾기 / transform.GetChild() (0) | 2022.04.19 |
[Unity] URL로 이미지 다운로드하기 / 무료 이미지 호스팅 사이트 추천 (0) | 2022.04.19 |
댓글