2

이번에는 이상한 오류가 발생했습니다. 그러나 이번에는 완전히 엉망입니다. 같은 클래스에서 메서드를 호출하려고 할 때 NullPointerException이 발생합니다.동일한 클래스에서 메서드를 매개 변수없이 호출하면 NullPointerException이 발생합니다.

우선 일부 코드가 있습니다. 문제의 라인부터 시작합시다. 이 방법은 물론, 이것보다 더 긴하지만, 이것은 그것의 시작이며, 모든 관련입니다 :

protected boolean isPaused() { 
    return paused.get(); 
} 

그리고 완전성 '을 위하여 :

protected synchronized void checkTransfers() { 
    if (isPaused()) 
     return; 
} 

isPaused 간단한 게터 방법입니다 :

protected AtomicBoolean paused = new AtomicBoolean(false); 

이제 문제는이 코드가 실행되는 시간의 약 50 %가, 단순히 나에게 아무 의미가없는 if (isPaused()) 라인에 NullPointerException이 발생한다는 것입니다. checkTransfers() 메서드는 isPaused()과 같은 클래스입니다. 동료는 예를 들어 다른 스레드가 CPU 시간을 가져 와서 객체에 대한 참조를 삭제했지만 객체가 내 코드의 어디에서나 참조를 잃어 버리지 않으면 문제가 멀티 스레딩에있을 수 있다고 언급함으로써 나를 도와 주려고했습니다. 또한 : this은 NPE가 트리거되면 여전히 올바르게 정의됩니다.

메인 830013674640 @ "프리 오 = 5 실행 가능 하는 java.lang.Thread.State : RUNNABLE com.omines.android.communicationmanager.CommunicationManager.checkTransfers에서 (CommunicationManager을 다음

스택 트레이스이다. java : 125) at com.omines.android.communicationmanager.DownloadTask.onPostExecute (DownloadTask.java:105) at com.omines.android.communicationmanager.DownloadTask.onPostExecute (DownloadTask.java:20) android.os. AsyncTask.finish (AsyncTask.java:602) android.os.AsyncTask.access $ 600 (AsyncTask.java:156) 01 android.os.Looper.loop에서 android.os.Handler.dispatchMessage (Handler.java:99) 에서 android.os.AsyncTask $ InternalHandler.handleMessage (AsyncTask.java:615) 에서 23,516,(Looper.java:154)at android.app.ActivityThread.main (ActivityThread.java:4945) at java.lang.reflect.Method.invokeNative (Method.java:-1) at java.lang.reflect.Method.invoke (Method.java : 511) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551) at dalvik.system .NativeStart.main (NativeStart.java:-1)

라인 125 in checkTransfers()은 위의 if 문입니다.

아무도 이런 행동을 일으킬 수있는 아이디어가 있습니까?

+0

방금 ​​관련이있는 것으로 보이는 [this] (http://stackoverflow.com/questions/12070118/nullpointerexception-thrown-in-java-synchronised-method-using-sockets) 질문입니다. 그 일을 먼저 시도하고 해결할 것입니다. –

+2

'일시 중지'를 시도 했습니까? – Fildor

+0

지금은 가지고 있지만 차이는없는 것 같습니다. 생각해 줘서 고마워. –

답변

1

맞아요, 사악한 디버깅이 필요했지만 문제를 발견 한 것 같습니다. 나중에 다른 사람에게 도움이 될 수 있도록 게시하십시오.

먼저 내 방법에 대해 좀 더 알아야합니다. 전체 내용은 다음과 같습니다.

protected synchronized void checkTransfers() { 
    if (isPaused()) 
     return; 
    while (transferQueue.peek() != null && (transferQueue.peek().priority == PRIORITY_URGENT || 
      (transferSemaphore.availablePermits() > maxConcurrentTransfers))) 
    { 
     CommunicationTask ct = transferQueue.poll(); 
     if (ct != null) 
     { 
      if (ct instanceof DownloadTask) 
       currentlyDownloading.add((DownloadTask)ct); 
      ct.execute(); 
     } 
    } 
} 

메소드 시작시 예외가 발생하지 않는 것으로 나타났습니다.예외가 발생하기 전에 예외가 발생하기 전에 전체 메서드를 한 번 실행 한 다음 종료하는 대신 디버거가 메서드의 첫 번째 줄로 이동하여 NullPointerException을 throw합니다.

함께 작업 할 수있는 뭔가가있어서, 나는 이것이 DownloadTask가 아니라 UploadTask가 실행될 때마다 일어났다는 것을 발견했다. 결과적으로 내 모든 DownloadTasks는 진행 상황 대화 상자를 표시 할 수 있도록 호출 Activity를 알았지 만 UploadTask는 호출자에 대한 참조 대신 항상 null으로 전달되었습니다. 구버전의 코드에서 이것은 괜찮 았지만, 최근에 약간의 변경을 한 후에 분명히 문제가되었습니다.

내 작업이 호출 활동에 존재하지 않는 참조에 액세스하려고 시도 할 때 예외가 발생하지 않는 이유는 아직 확실하지 않지만 분명히 관련없는 비트로 예외를 트리거하는 것은 정상적인 동작입니다. 암호.

시간을내어 내 질문을 읽고 도움을 주셔서 감사합니다. 적어도 내 대답이 다른 사람을 돕기를 바랍니다.