とある学生の技術Blog

半分くらい自分の備忘録として…

findViewById()でNull Pointer Exception エラー

随分と前につまづいていたところからひとつ。


MainActivity.java
public class MainActivity extends Activity { 
    EditText et = (EditText)findViewById(R.id.edit_text);

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

    }

...
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <EditText 
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    
</LinearLayout>

上記のプログラムではNull Pointer Exceptionが発生します。

理由は簡単なものです。

EditText et = (EditText)findViewById(R.id.edit_text);

ここでfindViewById()をしてしまうと
このEditTextがあるactivity_main.xmlがsetContentView()される前に呼び出されているのでエラーとなります。

つまり、findViewById()はsetContentView()より後に記述しなければいけません。

MainActivity.java
public class MainActivity extends Activity { 
    EditText et = null;

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 
       et = (EditText)findViewById(R.id.edit_text);
    }

...

これでエラーは発生しなくなります。