현재 진행 중인 Salina 프로젝트에서 나름 국제화를 적용하겠다고 상수 스트링을 values 리소스로 빼두고

final 키워드를 제거 후 멤버 변수 위치 그대로 두고 getString(int resourceId)를 호출하니 NullPointerException 발생


프로그래밍계의 지식인  StackOverflow느님께서 역시 해결책을 주셨다.


원인은 액티비티가 초기화되기 전에 리소스를 사용하려고 하면 NullPointerException이 발생할 수 있다고 한다.


즉 액티비티에서 사용하는 getString()은 Resources 객체의 getString()을 래핑한 메서드이고.

Resources는 Context 객체로부터 얻을 수 있는데, getString()을 풀어보면

getContext().getResources().getString()이 되는 셈이다.


따라서 해결책은 멤버 필드에서 바로 초기화를 하는 대신 onCreate 이 후 시점에 해야한다.

그냥 onCreate 안에서 하면 된다.

혹은 Application 클래스를 상속한 커스텀 Application을 만들고 거기에 static 메서드를 이용해서 컨텍스트를 통해 리소스를 가져오는 방법이다.

액티비티는 해당 액티비티가 onCreate 되어서야 초기화 후에 context를 갖지만 애플리케이션 단위에서는 처음 앱이 실행될 때 정보를 가지고 있기 때문에 가능하다.

몸이 지친건지.. 이상한데서 실수를 많이 한다. 어쩌면 그냥 바보일지도 모르겠다.

지금 널 포인터 때문에 생긴 문제도 어이없는 실수지만, 이거 전에 DB 테이블 생성하는데
CREATE TABEL 이라고 써놓고 익셉션 떠서 한참 찾았더랬지.
사실 로그에 "저 부분이 문장이 틀렸다고!" 라고 알려주는데 알아채지 못했다.

LABEL을 하도 많이 써서 그런지 이상하게 요즘 LE로 끝나는 단어를 EL로 쓰거나 EL로 끝나는 걸 LE로 쓴다.

좋지 않은 습관이지만 디버깅 툴을 이용하기 보다는 클래식하게(?) 화면 출력으로 변수 값을 찍으면서 디버깅 하곤 했는데
널 포인터 예외가 뜨길래 대체 널 포인터 날 구석이 없어서 한참을 방황하다가
결국 이클립스의 디버깅 모드로 차근차근 실행해봤다. 한줄 한줄 따라가고 있는데.. 이게 뭐야!!!!

return null;
...
return null;
...
return null; 
 


리턴 널이라니!!! 안드로이드 그리드에 연결한 어댑터에서 getView 메서드에... 왜 저런게 들어가있지..??????????

이것 때문에 별 이상한 소스부분을 다 봐서 왠만한 예외처린 더 한 듯하다.
한동안은 예외 생기면 리턴쪽만 볼 것 같다. -_


추가. 하아......



'마음이 뛰다' 카테고리의 다른 글

인생은 재밌다.  (0) 2011.09.10
막막 룰루랄라.  (0) 2011.08.26
롬업 후 APN 설정  (0) 2011.08.23
DHD LeeDroid 롬업, 커널업 완료  (0) 2011.08.22
아빡치 에잇퉤퉤페 Apache Http Client  (0) 2011.08.18

+ Recent posts