2014년 4월 13일 일요일

자바 3D

자바 3D 서적을 사고 공부를 하고 있는데 이건 뭐... 자바 3D는 발전이 거시기 허넹 ㅠㅠ

슬프다.


직접 해당 프로젝트에 참여키 위하여 자바를 다시 보고 있다.

그러던 중 디버깅 요청이 들어와서 여기 끄적거리면서 분석해 보려고 한다.

에러 메시지는 다음과 같다.


04-13 11:33:40.919: W/System.err(3823): java.lang.NullPointerException
04-13 11:33:40.919: W/System.err(3823): at taekwon.sorasoft.TouchViewContainer.touchViewCreator(TouchViewContainer.java:113)
04-13 11:33:40.919: W/System.err(3823): at taekwon.sorasoft.BService$2.motion_selection(BService.java:1186)
04-13 11:33:40.939: W/System.err(3823): at taekwon.sorasoft.BPreferenceActivity$7.onPreferenceChange(BPreferenceActivity.java:245)
04-13 11:33:40.939: W/System.err(3823): at android.preference.Preference.callChangeListener(Preference.java:910)
04-13 11:33:40.939: W/System.err(3823): at android.preference.TwoStatePreference.onClick(TwoStatePreference.java:64)
04-13 11:33:40.939: W/System.err(3823): at android.preference.Preference.performClick(Preference.java:966)
04-13 11:33:40.939: W/System.err(3823): at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:215)
04-13 11:33:40.939: W/System.err(3823): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
04-13 11:33:40.939: W/System.err(3823): at android.widget.AbsListView.performItemClick(AbsListView.java:1126)
04-13 11:33:40.939: W/System.err(3823): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2927)
04-13 11:33:40.939: W/System.err(3823): at android.widget.AbsListView$1.run(AbsListView.java:3780)
04-13 11:33:40.949: W/System.err(3823): at android.os.Handler.handleCallback(Handler.java:615)
04-13 11:33:40.949: W/System.err(3823): at android.os.Handler.dispatchMessage(Handler.java:92)
04-13 11:33:40.949: W/System.err(3823): at android.os.Looper.loop(Looper.java:137)
04-13 11:33:40.949: W/System.err(3823): at android.app.ActivityThread.main(ActivityThread.java:4886)
04-13 11:33:40.949: W/System.err(3823): at java.lang.reflect.Method.invokeNative(Native Method)
04-13 11:33:40.949: W/System.err(3823): at java.lang.reflect.Method.invoke(Method.java:511)
04-13 11:33:40.949: W/System.err(3823): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
04-13 11:33:40.949: W/System.err(3823): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
04-13 11:33:40.949: W/System.err(3823): at dalvik.system.NativeStart.main(Native Method)

자바나 안드로이드나 에러메시지가 길게 뜨면 일단 가장 위에가 문제이다.

NullPointException 이네.

1. 그냥 try catch로 감싸주고 넘어가면 된다.

2. 더 좋은 방법은 catch에서 null pointer가 났을 때 direction을 주는 것이며

3. 더 좋은 방법은 아예 null pointer가 일어날 상황을 원천 차단하는 것이다.

1의 방법은 try 치고 이클립스에서 Ctrl + space 치면 catch문이 자동으로 나오는데

광범위하게 Exception e로 줘 버리면 알아서 넘어간다.

문제점은 결국 NullPointer로 인하여(그런데 자바는 포인터가 없다고 책에서 이야기들

하지 않나? ㅋㅋ) 프로그램은 문제가 생긴다.

2의 방법은 null Pointer가 났을 때 향 후 문제의 소지가 없도록 코드를 넣거나 error flag를

두어 뒤에서 받아가는 녀석들이 오류가 난 상황을 계속 인지하게끔 프로그래밍 하는 것이

좋다. 아니면 아예 ERROR Handling class를 하나 만들어서 일괄처리 해 버리는 것이 좋다.

사실 3의 방법을 설명하려고 하는 것인데 간단히 말하면 Null Point가 나면 프로그램을

종료시킨다는 생각으로 프로그램을 짜는 것이다. 2의 방법과 사실 비슷하지만 다른 것이

있다. 해당 포인터(사실 인스턴스라고 하는게 맞겠다)를 쓰는 함수들에서 try catch를

모두 빼버리고 null pointer가 날 수 있는 상황을 무조건 고려한다.

 이런식으로 설계 하다 보면서 뒤에 만들어 지는 클레스는 앞에서 null pointer가 날 수 없기

때문에 안정적인 코드를 짤 수 있게 되고 base class들은 모든 null pointer 상황을 고려하고

test class를 짠다. test class는 간단히 해당 클레스 인스턴스를 얻어와서 값들을 다 뿌려

주는 class...

 결론적으로 3의 상황은 범용적으로 쓰이는 인스턴스를 집약시키고 test class를 무조건

만들어서 가능한 것이다. 사실 MVC 패턴이라고 말하면 간단하려나. View랑 Control이

Model 클레스의 인스턴스를 생성해서 쓸 터인데 test 클레스에서 해당 모델의 인스턴스를

무작위로 생성해 보는 것이다.

 이렇게 해도 결국 물리적인 메모리 상황 때문에 오류가 날 수도 있지만.

 아마 null pointer 상황을 아예 앞쪽에서 만들지 말아야지 라는 다짐은 해 본 사람이

그리 많지는 않을 것이다.

서론이 길었네.

믓튼.

aekwon.sorasoft.TouchViewContainer.touchViewCreator(TouchViewContainer.java:113)
04-13 11:33:40.919: W/System.err(3823):  at

에러 바로 밑이 문제다. 그래 이렇게 간단하면 의뢰하지 않았겠지.

aidl을 이용해서 값을 받아오는데 널포인터가 나는 것이었다.

해당 부분에 가서 aidl에서 읽어온 값을 이용해서 클래스를 또 만드는 부분이 있어서

해당 부분을 삭제하고 바로 이용하도록 하니 해결.

어려운 것은 대부분 race conditioning 문제.. 뭐 RC라고 하기엔 그렇고 타이밍이라고

해야 하나?

믓튼, 완전한 플렛폼은 아직 없는 셈이군(uc/os-iii 빼고)

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...