2013-09-03 2 views
2

나는 사지에 나가서 스위치 케이스에서 열거 형을 사용하려고했습니다. 그러나 분명히, 나는 잘못된 것을하고 있습니다. 내 프로그램을 실행하면Android (Java) 열거 형 null 포인터 오류

@Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
     case R.id.start_button: 
      timer_running = true; 
      // Make call to timer update class to start 
      break; 
     case R.id.stop_button: 
      timer_running = false; 
      // Make call to timer update class to stop 
      break; 
     case R.id.reset_button: 

      if (!timer_running) { 
       switch(state) { 
       case WORKOUT: 
        // TODO: Reset the counter to the workout time 
        break; 
       case REST: 
        // TODO: Reset the counter to the rest time 
        break; 
       } 
      } 
      break; 
     } 
    } 

온 클릭이 시작 요구 : 나는 그것을 활용

public class WorkoutStopwatch extends Activity implements OnClickListener { 

    private boolean timer_running = false; 
    public enum CounterState { 
     WORKOUT, REST 
    } 
    CounterState state; 

과 재정의의 onclick 방법 :

여기에 내가 열거를 정의하는 코드입니다 중지 버튼은 정상적으로 작동하지만 재설정 버튼을 사용하면 응용 프로그램이 스위치 행에서 '치명적 예외 : 주'및 'java.lang.NullPointerException'오류가 발생하여 충돌이 발생합니다. 동의합니다

private enum CounterState { 
     UNKNOWN(0), 
     WORKOUT(1), 
     REST(2); 

     private int stateValue; 

     CounterState(int state) { 
      this.stateValue = state; 
     } 

     public int getStateValue() { 
      return stateValue; 
     } 

     public void setStateValue(int state) { 
      this.stateValue = state; 
     }  
    } 

    CounterState state; 

는, 더 완전한 모양 : 내가 읽어 봤는데 바로는이 스위치를 읽을 때 열거의 값이 null 것으로 보인다, 그래서이 내 열거 선언을 변경 정의,하지만 여전히 문제가 발생합니다. 이와 같은 코드를 남겨두면 문제가 해결되지 않았지만 읽은 상태는 여전히 null 인 것 같습니다. 과 같이 객체의 선언에 int를 추가 :

CounterState state(0); 

나에게 "이 토큰을 삭제"0 "토큰에 구문 오류"의 이클립스 오류를 제공합니다. 그래서 나는 조금 잃어 버렸어. 내가 열거 할 수있는 것은 열거 형의 생성자가 있다는 것입니다.이 생성자는 생성시 값을 초기화하기 위해 int를 전달할 수 있어야하지만 작동하지 않는 것 같습니다.

+3

Java가 C++이 아닙니다. 초기화 및 선언은 별도의 단계 (또는 적어도 별도의 구문)입니다. 아무것도 지정하지 않으면 변수는 기본값 ('null', 0 또는 false; 로컬 변수가 아니면 초기화하지 않은 경우 액세스 할 수 없습니다)을 갖습니다. –

+0

도움을 주셔서 감사합니다. 두 가지 진술로 선언하고 초기화하는 데 익숙하지 않았습니다. – iYeager

답변

4

변수를 사용하기 전에 state 변수를 초기화 해 보았습니까?

CounterState state = CounterState.UNKNOWN; 
0

null 포인터 예외는 변수를 사용하기 전에 변수를 사용하거나 초기화하지 않을 때만 발생합니다. 먼저 여기서 사용한 모든 변수와 초기화 단계를 확인하십시오. 너 자신, 이렇게 앞으로는 이런 종류의 실수를하지 않을 것이다.