2013-11-23 2 views
-2

Я новичок в android. В моей программе я вставляю слово и его определение и нажимая кнопку, он вставляет данные в базу данных. На прослушивателе кликов я написал IF для проверки, являются ли поля пустыми, но во время выполнения даже при вставке данных он вызывает ошибку NullPointerException в событии OnClick. Мне очень нужна помощь ....NullPointerException в OnclickListener

public class MainActivity extends Activity { 

DBAdapter db; 

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

    db = new DBAdapter(this); 
    db.open(); 
    Button btn = (Button) findViewById(R.id.button1); 
    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      EditText word = (EditText) findViewById(R.id.et_word); 
      EditText def = (EditText) findViewById(R.id.et_definition); 

      if(!String.valueOf(word.getText()).equals("") & 
        !String.valueOf(def.getText()).equals("")){ 
       db.insertData(String.valueOf(word.getText()), String.valueOf(def.getText()), 
         DBAdapter.TABLE_DIC); 
      }else{  
        Toast.makeText(MainActivity.this, "please insert a word and its definition", 
          Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    db.close(); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    db.open(); 
} 
} 

LogCat:

11-23 13:49:45.728: E/AndroidRuntime(15709): FATAL EXCEPTION: main 
11-23 13:49:45.728: E/AndroidRuntime(15709): java.lang.NullPointerException 
11-23 13:49:45.728: E/AndroidRuntime(15709): at ir.englishdic.MainActivity$1.onClick(MainActivity.java:34) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at android.view.View.performClick(View.java:4240) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at android.view.View$PerformClick.run(View.java:17721) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at android.os.Handler.handleCallback(Handler.java:730) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at android.os.Looper.loop(Looper.java:137) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at android.app.ActivityThread.main(ActivityThread.java:5103) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at java.lang.reflect.Method.invokeNative(Native Method) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at java.lang.reflect.Method.invoke(Method.java:525) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-23 13:49:45.728: E/AndroidRuntime(15709): at dalvik.system.NativeStart.main(Native Method) 
+0

разместить Ваш LogCat – Manishika

+0

Пожалуйста inittialise и 'findViewBy' ваши не Просмотров в' EditText слово OnCliCkListener = (EditText) findViewById (R.id.et_word); EditText def = (EditText) findViewById (R.id.et_definition); ' –

+1

Вам просто нужно научиться читать лог-код. Он расскажет вам, что является нулевым, и часто бывает легко отступить оттуда. Это легко исправить 99,99% времени, и вам, вероятно, никогда не придется публиковать о NPE здесь. Возможно, вам будет сложно найти решение, когда вы новичок в java/android, но именно поэтому вы читаете учебники и код. – keyser

ответ

0

Вам нужно заменить & в вашем if заявление с &&.

Например:

if(!String.valueOf(word.getText()).equals("") && 
       !String.valueOf(def.getText()).equals("")) 
+0

Как это можно исправить NPE? –

+0

без с logcat, его просто дикое предположение :) – waqaslam

+0

Поведение не будет изменено, но я согласен, что использование '&&' более подходит в этом случае. http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2 –

0

Try, чтобы сделать ваше прогонять EditText глобальным и Инициализирует в OnCreate не ИНТ на OnClick и только получить значение в OnClick.

public class MainActivity extends Activity { 

DBAdapter db; 

EditText word, def; 

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

    // TODO Auto-generated method stub 
    word = (EditText) findViewById(R.id.et_word); 
    def = (EditText) findViewById(R.id.et_definition); 
    db = new DBAdapter(this); 
    db.open(); 
    Button btn = (Button) findViewById(R.id.button1); 
    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) {       

      if(!String.valueOf(word.getText()).equals("") && 
        !String.valueOf(def.getText()).equals("")){ 
       db.insertData(String.valueOf(word.getText()), String.valueOf(def.getText()), 
         DBAdapter.TABLE_DIC); 
      }else{  
        Toast.makeText(MainActivity.this, "please insert a word and its definition", 
          Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
} 
+0

Как это можно исправить NPE? –

Смежные вопросы