2012-06-08 4 views
1

화면에서 버튼을 누른 후에 텍스트보기에서 "Hello"문구를 표시하도록하는 아주 기본적인 프로그램을 작성하고 있지만 실행 할 때마다 왜 응용 프로그램이 중지되었는지는 알 수 없습니다 뜻밖에.프로그램이 예기치 않게 중지되는 이유는 무엇입니까?

public class EtudeActivityActivity extends Activity{ 
    TextView tvResponse; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final TextView tvResponse = (TextView) findViewById (R.id.tvResponse); 
    } 


    public void updateTV(View v) { 
    tvResponse.setText("Hello"); 
    } 
} 

은 또한, 나는 버튼 내 main.xml에의 파일로 android:onClick = "updateTV"를 삽입 :

이 내가 쓴 프로그램입니다.

도움 주셔서 감사합니다.

+0

stacktrace 후 – nhaarman

답변

3

tvResponse 멤버 변수를 설정하지 않았기 때문입니다. 대신 동일한 이름으로 새 로컬 변수를 설정합니다. 당신이 setText()를 호출 할 때, 당신은

당신은 멤버 변수를 설정하는

final TextView tvResponse = (TextView) findViewById (R.id.tvResponse); 

tvResponse = (TextView) findViewById (R.id.tvResponse); 

에 변경해야하는 잘못된 참조를 액세스하는, 그래서 나중에 유효한 참조가 ( updateTV()이 호출 될 때)

+0

이 작업을 많이했습니다! ID를 찾기 위해 tvresponse를 텍스트보기로 정의했을 때 정확히 작동하지 않는 이유는 무엇입니까? – user1445478

+0

'tvResponse'의 지역 정의가 멤버 변수를 숨겨서 멤버 변수를 변경하지 않았으므로 디폴트 값 :'null'을 남겨 둡니다. 'onCreate()'가 끝나면 findViewById()의 결과가 없어집니다. – Attila

1

난 당신이 당신이 우리를 표시하지 않은 tvResponse라는 예를 변수를 가지고 생각 - 즉, updateTV 방법을 참조 할 것입니다. 이는 onCreate 내에서 선언 한 변수 tvResponse 변수와 완전히 별개입니다. 로컬 변수 선언에서 onCreate의 마지막 줄을 tvResponse 변수에 대한 간단한 할당으로 변경하면 문제가 발생할 수 있습니다. 그렇지 않은 경우 인스턴스에 tvResponse 변수에 값을 할당하는 것이 없으면 기본값은 null이고 NullPointerExceptionupdateTV이됩니다.

관련 문제