2016-06-14 16 views
0

Ich bin eine einfache Übung macht einen Broker zu bauen SQLite für den Zugriff auf meine Haupttätigkeit ist:android Studio Fehler: „java.lang.NullPointerException: Der Versuch, virtuelle Methode aufzurufen ...“

package com.example.mauro.localtest; 

import android.app.Activity; 
import android.database.sqlite.SQLiteDatabase; 

public class MainActivity extends Activity { 
    DbBroker db = new DbBroker(this, "my_database", null, 1); 
    SQLiteDatabase sqldb = db.getWritableDatabase(); 
    public int test = db.insertTest("New test", "Test created from app"); 
} 

während die DbBroker Klasse:

package com.example.mauro.localtest; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

/** 
* Created by Mauro on 09/06/2016. 
*/ 
public class DbBroker extends SQLiteOpenHelper { 
    public DbBroker(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
     super(context, name, factory, version); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase arg0) { 
     arg0.execSQL("create table tests (id INTEGER PRIMARY KEY, publicid INTEGER, testname TEXT, description TEXT"); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 

    } 
    public int insertTest(String name, String desc){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues vals = new ContentValues(); 
     vals.put("testname", name); 
     vals.put("description", desc); 
     return (int) db.insert("tests", null, vals); 
    } 
} 

Als ich das Projekt ausführen, dieser Fehler die App beendet:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.mauro.localtest/com.example.mauro.localtest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

jemand mir helfen kann unders Und wo ist das Problem?

+0

Haben Sie Aktivität in Manifest definiert? –

+4

Ich werde Ihnen vorschlagen, einmal zu versuchen, indem Sie den Code als DbBroker ändern db = new DbBroker (getActivity(), "my_database", null, 1); Ab sofort sehe ich nur Kontext ist der Kandidat für null. Ich fand eine ähnliche Frage: http://stackoverflow.com/questions/30064080/android-app-crashes-on-startup-sqlite-nullpointerexception-in-contactsfragment http://stackoverflow.com/questions/29545524/android-nullpointerexception-unable-to-load-database-in-listview-in-a-fra Hoffnung Es kann Ihr Problem lösen. – pbajpai21

+0

Ich denke, dass Sie Ihren DB-Broker bei womg initialisieren, aufgrund dessen der Kontext null ist. Teilen Sie bitte den Funktionscode, von dem diese Klasse initialisiert wird. –

Antwort

1

ich glaube, das Problem in diesen Zeilen ist:

DbBroker db = new DbBroker(this, "my_database", null, 1); 
SQLiteDatabase sqldb = db.getWritableDatabase(); 
public int test = db.insertTest("New test", "Test created from app"); 

Variablen werden in Compiler sortiert werden, um die Zuordnungsspeicher zu optimieren. so kann die Reihenfolge von diesen während complie geändert werden. So kann das Szenario sein, die Zeile # 2 wird zuerst aufgerufen und db-Instanz ist jetzt null so wurde die Ausnahme ausgelöst.

Um es zu beheben, platzieren Sie es in der angegebenen Methode, z. B. onCreate(), ... so dass diese Befehle nacheinander ausgeführt werden können.

Hinweis: Sie vermissen eine schließen Klammer am Ende des SQL-Befehl.

create table tests (id INTEGER PRIMARY KEY, publicid INTEGER, testname TEXT, description TEXT); 
Verwandte Themen