2012-03-27 4 views
1

현재 스레드의 스트림에서 개체를 검색하는 데 문제가 있습니다. 현재 스트림에서 읽으려고하는 곳에서 널 포인터 오류가 발생합니다. 입력 스트림은 서비스 클래스에서 인스턴스화되어 앱에 대한 하나의 연결 만 필요합니다. 왜 널 포인터 오류가 발생하는지에 대한 명백한 이유가 있는지 누구든지 알 수 있습니까?스트림 스레드 널 포인터 오류

@Override 
public void run() { 
    try { 
     while(true){ 
      while ((mess = (com.DrawTastic.Message) messRec.readObject()) != null) { 

       runOnUiThread(new Runnable() { 
        public void run() { 

         mAdapter.add(mess); 

        } 
       }); 
      } 
     } 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

오류 추적 :

03-27 23:08:10.800: ERROR/AndroidRuntime(2218): FATAL EXCEPTION: Thread-13 
03-27 23:08:10.800: ERROR/AndroidRuntime(2218): java.lang.NullPointerException 
03-27 23:08:10.800: ERROR/AndroidRuntime(2218):  at com.DrawTastic.ChatActivity.run(ChatActivity.java:149) 
03-27 23:08:10.800: ERROR/AndroidRuntime(2218):  at java.lang.Thread.run(Thread.java:1019) 
+0

약간의 OT하지만 루프가 null을 테스트하는 이유는 무엇입니까? null 보내는 중입니까? 또는'readObject()'가 스트림의 끝에서 null을 리턴한다는 오해를 받고 있습니까? 그렇지 않으면'EOFException'을 throw합니다. – EJP

답변

2

나는 엉망이 클래스 레벨의 필드해야 가정, 또는 다른 사람이 컴파일에 실패합니다. 그러나 기본적으로 모든 Runnable과 동일한 참조를 공유합니다. 이는 ... 루프가 끝날 때까지 null입니다.

대신, 로컬 최종 변수에 mess를 복사 아마 바람직입니다 :

final Message thisMess = mess; 
runOnUiThread(new Runnable() { 
    public void run() { 
    mAdapter.add(thisMess); 
    } 
}); 

... 그것은 비동기 적으로 실행중인 것으로 가정하면, 내가 알고 안드로이드 충분히 잘 모른다.

1

mAdapternull입니다.