2011-09-22 3 views
0

이것은 처음 자바 프로그래밍이기 때문에 왜 함수 밖의 변수에 액세스 할 수 없는지 이해할 수 없습니다. 나는 마지막에 변수를 변경하려고하지만 오류가 여전히있다 :Java에서 내부 클래스 내부의 최종 변수 번호에 어떻게 액세스합니까?

 String[] number = this.nextNumber(); 
     Button submitbutton = (Button)findViewById(R.id.button1); 
     submitbutton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        // Perform action on clicks 
        //Toast.makeText(Addition.this, inp.getText(), Toast.LENGTH_SHORT).show(); 
        if(inp.getText().toString().equals("")) { 
         Toast.makeText(Addition.this, "Please enter your answer", Toast.LENGTH_SHORT).show(); 
        } else { 
         int answer = Integer.parseInt(inp.getText().toString()); 
         if(Integer.parseInt(number[1]) == answer) { 
          Toast.makeText(Addition.this, "NICE!", Toast.LENGTH_SHORT).show(); 
          int currentPoint = Integer.parseInt((String) points.getText()); 
          currentPoint = currentPoint + 1; 
          points.setText(Integer.toString(currentPoint)); 
          number = Addition.this.nextNumber(); // this part doesn't work. why? 
         } else { 
          Toast.makeText(Addition.this, "Wrong!", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       } 
      }); 
:

여기

Cannot refer to a non-final variable number inside an inner class defined in a different method

내 코드입니다 :

The final local variable number cannot be assigned, since it is defined in an enclosing type

변수에는 final 키워드가 없습니다, 오류이됩니다

작동하지 않는 부분에 댓글을 달았습니다.

답변

5

글쎄, 당신은에 올라오고있는 두 가지 규칙이 컴파일러 상태로 정확하게 이유를 말해주십시오

  • 마지막 변수가 정확히 한 번만 할당되어야합니다 - 나중에 그 값을 변경할 수 없습니다
  • 할 수 있습니다 그들이 최종 있다면 익명의 내부 클래스 접속 지역 변수

당신이 뭘 하려는지 명확하지 않다 또는 OnClickListener에서 로컬 변수의 값을 변경하려고합니다. 여기에 더 큰 그림이 뭐야? 익명의 내부 클래스 자체에서 변수를 선언하거나 클래스 내부에서 인스턴스 변수로 만들 수 있습니까?

자바를 처음 접한다면 을 강력하게 입력하면됩니다.보다 간단한 코드를 작성하는 것이 좋습니다. 익명 내부 클래스는 이며 상대적으로입니다.

Android 개발을 시작하기 전에 데스크톱에서 언어으로 Java를 사용하는 것이 좋습니다. 간단한 콘솔 앱에서 핵심 라이브러리 (콜렉션, IO 등) 및 흥미로운 비트를 사용하여 게임하십시오. 안드로이드 관련 문제없이 쉽게 시작하고 디버그 할 수 있습니다.

+0

예를 들어 number 경우 배열 (String[]는) 다음 다음이 작동하지하는 String이었다. 내 버튼을 클릭 할 때 변수의 값을 변경하는 다른 방법이 있습니까? –

+0

@ Kevin :하지만 그것은 * local 변수입니다. 그것을 바꾸면 어떤 효과가있을 것이라고 생각하십니까? –

0

EDIT : 로컬 변수를 수정하기 위해 리스너를 사용하는 것은 쓸모가 없다고 말하면, 리스너가 값을 할당 할 때 로컬 변수가 범위를 벗어나고 다른 어떤 방법으로도 접근 할 수 없다고 말합니다. 아래에 쓰는 것은 number의 수명이이 방법 밖에있는 경우에만 의미가 있습니다.

익명 내부 클래스 안에서는 포함 범위의 final 변수에만 액세스 할 수 있습니다. 그러나 은 최종 변수에을 할당 할 수 없습니다. 일반적인 트릭은 비 최종 변수 주위에 최종 래퍼를 사용하는 것입니다. 내가 버튼을 클릭 할 때 번호를 리셋하기 위해 노력하고있어

final String[] number = new String[] { this.nextNumber(); } 
      // number[0] has the number, number itself is final wrapper 
    Button submitbutton = (Button)findViewById(R.id.button1); 
    submitbutton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on clicks 
      //Toast.makeText(Addition.this, inp.getText(), Toast.LENGTH_SHORT).show(); 
      if(inp.getText().toString().equals("")) { 
       Toast.makeText(Addition.this, "Please enter your answer",    
           Toast.LENGTH_SHORT).show(); 
      } else { 
       int answer = Integer.parseInt(inp.getText().toString()); 
       if(Integer.parseInt(number[1]) == answer) { 
        Toast.makeText(Addition.this, "NICE!", Toast.LENGTH_SHORT).show(); 
        int currentPoint = Integer.parseInt((String) points.getText()); 
        currentPoint = currentPoint + 1; 
        points.setText(Integer.toString(currentPoint)); 
        number[0] = Addition.this.nextNumber(); 
        // number is final and cannot be assigned but number[0] can 
       } else { 
        Toast.makeText(Addition.this, "Wrong!", Toast.LENGTH_SHORT).show(); 
       } 
      } 
      } 
     }); 
관련 문제