Attempt to invoke virtual method on a null object reference

882
04 февраля 2017, 08:33

Есть приложение, в нем через DialogFragment заносятся текстовые данные, база данных подключается так:

public class DatabaseHelper extends SQLiteOpenHelper{
private static String DB_NAME = "Database.sqlite";
private static String DB_PATH = "/data/data/com.example.user.test/databases/";
private SQLiteDatabase myDatabase;
private final Context myContext;
public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, 1);
    this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void checkAndCopyDatabase(){
    boolean dbExist = checkDatabase();
    if (dbExist = true){
        Log.d("Log", "database already exist");
    }else {
        this.getReadableDatabase();
    }
        copyDatabase(myContext);
}
public boolean checkDatabase(){
    SQLiteDatabase checkDB = null;
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
        if (checkDB != null){
        checkDB.close();
    }
    return checkDB != null ? true : false;
}
public boolean copyDatabase(Context context) {
    try {
        InputStream inputStream = myContext.getAssets().open(DatabaseHelper.DB_NAME);
        String outFileName = DatabaseHelper.DB_PATH + DatabaseHelper.DB_NAME;
        OutputStream outputStream = new FileOutputStream(outFileName);
        byte[]buff = new byte[1024];
        int length = 0;
        while ((length = inputStream.read(buff)) > 0) {
            outputStream.write(buff, 0, length);
        }
        outputStream.flush();
        outputStream.close();
        Log.w("Log","DB copied");
        return true;
    }catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}
public void openDatabase(){
    String dbPath = myContext.getDatabasePath(DB_NAME).getPath();
    if (myDatabase != null && myDatabase.isOpen()) {
        return;
    }
    myDatabase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public synchronized void close(){
    if (myDatabase != null){
        myDatabase.close();
    }
    super.close();
}
public Cursor QueryData(String query){
    return myDatabase.rawQuery(query,null);
}
public void addItem(String E, String U) {
    ContentValues contentValues = new ContentValues();
    contentValues.put("text", E);
    contentValues.put("text2", U);;
    openDatabase();
    myDatabase.insert("tabel", null, contentValues);
    close();
}}

Ошибка появляется в классе отвечающем за диалог:

public class AlertDialog extends DialogFragment implements View.OnClickListener{
String E,U;
DatabaseHelper databaseHelper;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.add_dialog, null);
    EditText editText = (EditText) v.findViewById(R.id.editText);
    EditText editText2 = (EditText) v.findViewById(R.id.editText2);
    E = editText.getText().toString();
    U = editText2.getText().toString();
    v.findViewById(R.id.button).setOnClickListener(this);
    v.findViewById(R.id.button2).setOnClickListener(this);
    return v;
}
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button:
            databaseHelper.addItem(E, U);
            dismiss();
            break;
        case R.id.button2:
            dismiss();
            break;
        default:
            break;
    }
}}

В строке:

databaseHelper.addItem(E, U);

Подскажите пожалуйста в чем проблема.

Answer 1

Проблема заключается в том, что Вы нигде не инициализируете объект databaseHelper, а по-умолчанию он, как и любой объект, инициализируется значением null. Далее происходит вызов (не статического!) метода на null-объекте, отсюда и происходит NullPointerException (статические же методы могут быть вызваны на null-объекте, но это так, к слову).

В методе onCreateView(...) создайте объект, а после этого уже используйте его:

databaseHelper = new DatabaseHelper(getActivity());
READ ALSO
Create Spring Boot projects into NetBeans IDE 8 (I need IDE-plugins)

Create Spring Boot projects into NetBeans IDE 8 (I need IDE-plugins)

Добрый деньПредстоит новый java maven-проект с использованием Spring Boot, Spring Cloud и т

464
Сравнение объектов с разными типами

Сравнение объектов с разными типами

Доброго времени сутокХочу распарсить вот такой json-файл

467
Сохранение цен в логах

Сохранение цен в логах

Есть таблица товаров (Goods)У каждого товара есть цена

442