2014-09-08 3 views
0

구현하는 방법에서 값을 반환해야하지만, 나에게나는 아래의 방법에서 부울 값을 반환 할 java.util.Timer

"Local variable stopped is access from within inner class; 
needs to be declared final." 

말하는 오류 메시지를 제공하지만 마지막으로 중단 선언하는 경우 나는 그것의 가치를 바꿀 수 없다.

나는 타이머 때문인 것으로 알고 있습니다. 제발 제안!

public boolean requestTimer(final Club club,final String msisdn, final int time) { 

    boolean stopped=false; 

    new java.util.Timer().schedule( 
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       stopped=checkStopped(club,msisdn); //this line has the error         
      } 
     }, time); 
    return stopped; 
} 

답변

1

나는 알고는 타이머

그것은 당신이 내부 클래스에서 로컬 변수를 사용하려고 시도와 함께 할 타이머 모든과 아무 상관이 때문이다. Java는 내부 클래스에서 사용되는 로컬 변수의 복사본을 만들고 두 변수 (원본과 복사본)는 원본이 최종 선언되지 않은 경우 변경됩니다.

그러나 내가 마지막으로 중지되었다고 선언하면 값을 변경할 수 없습니다.

True. 그래서 당신은 이것을 할 수 없습니다. 가능한 해결책은 로컬 변수를 사용하지 않는 것입니다. 대신 클래스에서 선언 된 필드를 사용하십시오.

+0

감사 메이트! 오류가 없습니다 .. 테스트가 시작되었습니다! –

+0

@ MadanMadan : 천만에! –

1

로컬 변수를 내부 클래스로 수정할 수 없습니다. 액세스 할 수는 있지만 최종 선언이 있어야 할당 된 후에 변경할 수 있습니다.

내부 클래스의 외부 클래스 필드를 아무 문제없이 수정할 수 있습니다. 선언을 필드 수준으로 이동하십시오.

boolean stopped=false; 

    public boolean requestTimer(final Club club,final String msisdn, final int time) 
    (...) 

이 방법을 사용할 수 있습니다.

당신이 후 일정 지연을 실행하고 결과를 반환해야 작업이있는 경우, 내가 대신 TimeTaskCallableScheduledExecutorService 대신 Timer를 사용하는 것이 좋습니다 것입니다. 그런 다음 필요한 값을 반환하는 ScheduledFuture을 얻거나 아직 사용할 수없는 경우 현재 스레드를 일시 중단합니다. 당신은 final이지만, 변경 가능한 값을 유지하는 무언가를 가지고, 따라서

import org.omg.CORBA.BooleanHolder; 
... 
final BooleanHolder stopped= new BooleanHolder(); 
... 
stopped.value = checkStopped(club,msisdn); 
... 
return stopped.value; 

:

1

당신 수도 (AB)는 BooleanHolder를 사용합니다. int와 비슷합니다.

+0

또한 예상대로 작동하지 않습니다. 값을 반환하면 타이머가 아직 실행되지 않았을 수 있습니다. –

관련 문제