NullPointerException и EditText

146
13 марта 2018, 02:35

Великая java требует от меня, что бы переменные name, number, data были final, но если их сделать final, то текст с edittext еще не будет получен и я схвачу NullPointerException, как исправлять? Код:

        String name =  editName.getText().toString();
    String number = editNumber.getText().toString();
    String data =editData.getText().toString();
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ch.insert(name,number,data); //Добавляем новую запись

Логи:

03-11 23:09:19.522 6073-6073/com.example.user.phonenumbers E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: com.example.user.phonenumbers, PID: 6073
                                                                         java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.phonenumbers/com.example.user.phonenumbers.Main2Activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702)
                                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2768)
                                                                             at android.app.ActivityThread.access$900(ActivityThread.java:190)
                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1590)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                             at android.os.Looper.loop(Looper.java:207)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5927)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:958)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:819)
                                                                          Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                                             at com.example.user.phonenumbers.Main2Activity.onCreate(Main2Activity.java:24)
                                                                             at android.app.Activity.performCreate(Activity.java:6362)
                                                                             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1122)
                                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
                                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2768) 
                                                                             at android.app.ActivityThread.access$900(ActivityThread.java:190) 
                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1590) 
                                                                             at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                             at android.os.Looper.loop(Looper.java:207) 
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5927) 
                                                                             at java.lang.reflect.Method.invoke(Native Method) 
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:958) 
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:819) 

Полный код активности:

public class Main2Activity extends AppCompatActivity {
FloatingActionButton btn;
EditText editName,editNumber,editData;
ContactsHelper ch;
@Override
protected void onCreate(Bundle savedInstanceState) {
    btn = (FloatingActionButton) findViewById(R.id.floatbtn2);
    editName = (EditText) findViewById(R.id.nameEdit);
    editNumber = (EditText) findViewById(R.id.numberEdit);
    editData = (EditText) findViewById(R.id.dataEdit);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name =  editName.getText().toString();
            String number = editNumber.getText().toString();
            String data =editData.getText().toString();
            //Проверяем введённые данные
            if(checkIsValid(name, number, data))
                ch.insert(name,number,data); //Добавляем новую запись
            Intent i = new Intent(Main2Activity.this,MainActivity.class);
            startActivity(i);
        }
    });
}
boolean checkIsValid(String name,String number, String data){
    if(name!=null&&number!=null&&data!=null){
        return true;
    }else{
        return false;
    }
}
}

Код ContactsHelper:

public class ContactsHelper {
SQLiteDatabase db; // объект для манипулирования данными в базе.
ContactsHelper(Context context) {
    DBHelper dbHelper = new DBHelper(context); //инициализируем нашего помошника базы данных
    db = dbHelper.getWritableDatabase(); // получаем доступ к базе с возможностью записи/чтения
}
//метод для того, чтобы положить данные в базу
long insert(String name, String phone, String birthday) {
    ContentValues cv = new ContentValues();// хранилище с принципом ключ-значени
    cv.put(DBHelper.COLUMN_NAME, name);
    cv.put(DBHelper.COLUMN_PHONE, phone);
    cv.put(DBHelper.COLUMN_BIRTHDAY, birthday);
    return db.insert(TABLE_NAME, null, cv);// метод insert возвращает id, помещенного объекта в таблицу.
    // указали имя таблицы и хранилище данных
}
//метод для получения всех записей из таблицы
 ArrayList<Contact> getAll() {
    Cursor mCursor = db.query(TABLE_NAME, null, null, null, null, null,
            null);
    ArrayList<Contact> arr = new ArrayList<>();
    mCursor.moveToFirst();
    if (!mCursor.isAfterLast()) {
        //дедай пока записи есть в таблице
        do {
            long id = mCursor.getLong(DBHelper.NUM_COLUMN_ID);
            String name = mCursor.getString(DBHelper.NUM_COLUMN_NAME);
            String phone = mCursor.getString(DBHelper.NUM_COLUMN_PHONE);
            String birthday = mCursor.getString(DBHelper.NUM_COLUMN_BIRTHDAY);
            // получем значения соотвествующих полей и формируем объект, добавив его в коллекцию.
            arr.add(new Contact(id, name, phone, birthday));
        } while (mCursor.moveToNext());
    }
    db.close(); // закрыли транзакцию
    return arr; // вернули коллекцию
}
Answer 1

Попробуйте так:

public class Main2Activity extends AppCompatActivity {
FloatingActionButton btn;
EditText editName,editNumber,editData;
ContactsHelper ch;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    btn = (FloatingActionButton) findViewById(R.id.floatbtn2);
    editName = (EditText) findViewById(R.id.nameEdit);
    editNumber = (EditText) findViewById(R.id.numberEdit);
    editData = (EditText) findViewById(R.id.dataEdit);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name =  editName.getText().toString();
            String number = editNumber.getText().toString();
            String data =editData.getText().toString();
            //Проверяем введённые данные
            if(checkIsValid(name, number, data))
                ch.insert(name,number,data); //Добавляем новую запись
            Intent i = new Intent(Main2Activity.this,MainActivity.class);
            startActivity(i);
        }
    });
}
boolean checkIsValid(String name,String number, String data){
    if(!name.isEmpty() && !number.isEmpty() && !data.isEmpty()){
        return true;
    }else{
        return false;
    }
}
}
READ ALSO
Как прочесть значение из JSON на Java?

Как прочесть значение из JSON на Java?

Как извлечь в переменную типа int число 2 из JSON-ответа на языке JAVA ? (вместо 2 может быть любое многозначное число)

227
Вопрос про авторизацию FireBase

Вопрос про авторизацию FireBase

Мне нужно сделать авторизацию по номеру телефонаВ принципе с задачей я уже справился следующим образом:

181
Значения перечисления в switch-case блоке

Значения перечисления в switch-case блоке

У меня есть простое перечисление:

157