# merkwürdige Exception mit android und SQLLite



## Goldfish (27. Jul 2014)

Hey, ich bin mal wieder endgültig am Ende mit meinem Latein und weiß mir nicht merh weiter zu helfen. Google hilft mir da auch nicht wirklich, da ich eine unmögliche NullPointer habe...
Ich habe folgenden Code:


```
public class NetworkRequestListManager extends BaseDatabaseHandler implements Observer {
    private static NetworkRequestListManager networkRequestListManager = new NetworkRequestListManager();

    private NetworkRequestListManager () {
        super(Mobile4dApplication.getContext());
        NetworkObservableStatus.addNetworkListener( this );
    }

    ...

    public static synchronized void addElement(NetworkRequest networkRequest) {
        SQLiteDatabase db = networkRequestListManager.getWritableDatabase();

        ContentValues values = new ContentValues();
        try {
            values.put(BaseDatabaseHandler.networkRequest_type, networkRequest.getClass().getName());
            values.put(BaseDatabaseHandler.requires_login, networkRequest.isRequiresLogin() ? 1 : 0);
            values.put(BaseDatabaseHandler.networkRequest_timestamp, networkRequest.getTimestamp());
            values.put(BaseDatabaseHandler.networkRequest, networkRequest.toBlob());
        } catch (IOException e) {
            Log.e("addElement", "Exception: " + e.getMessage());
            e.printStackTrace();
        }
        Log.e("addElement", "number of NetworkRequests: " + getNumberOfRequests());
        Log.e("addElement", "db: " + db);
        Log.e("addElement", "TABLE_NETWORK_REQUEST: " + BaseDatabaseHandler.TABLE_NETWORK_REQUEST);
        Log.e("addElement", "ContentValues: " + values);
        db.insert(BaseDatabaseHandler.TABLE_NETWORK_REQUEST, null, values);
        db.close();

        if (NetworkObservableStatus.isNetworkConnectionAvailable()) {
            NetworkRequestListManager.startService();
        }
    }

    ...
}
```

In der Methode addElement erhalte ich eine NullPointerException in der Zeile:
_db.insert(BaseDatabaseHandler.TABLE_NETWORK_REQUEST, null, values);_
Die Ausgaben für meine Werte, wie sie oben im Code zu sehen sind, sehen wie folgt aus:


```
07-27 19:22:18.439: ERROR/addElement(10002): number of NetworkRequests: 0
07-27 19:22:18.439: ERROR/addElement(10002): db: android.database.sqlite.SQLiteDatabase@41989078
07-27 19:22:18.439: ERROR/addElement(10002): TABLE_NETWORK_REQUEST: networkRequestTable
07-27 19:22:18.447: ERROR/addElement(10002): ContentValues: timestamp=1406481738435 type=de.uni_bremen.network.userManagement.LoginRequest requires_login=0 network_request=[B@41992140
```

ich hab auch schon versucht den null-Wert gegen einen leeren String auszutauschen. Also:
_db.insert(BaseDatabaseHandler.TABLE_NETWORK_REQUEST, "", values);_
Gibt aber auch die gleiche NullPointerException.

Hat irgendwer vielleicht schonmal das gleiche Problem gehabt und kann mir hier helfen? ich weiß einfach nicht mehr weiter an der Stelle.


----------



## JavaMeister (27. Jul 2014)

Weil du "null" übergibst?

Ansonsten Stacktrace posten


----------



## Goldfish (27. Jul 2014)

wie im Post oben schon erwähnt, liegt es nicht am übergebenen null, da ichs auch schon mit einem leeren String versucht habe, und trotzdem NullPointer. Der Witz ist allerdings, dass das Codestück vor einiger Zeit noch funktionierte... daran hat sich nichts geändert und auf einmal, gehts nicht mehr. Bei einer Operation, die schon tausend mal geklappt hat... ich schnalls echt nciht...
Aber heir der Stacktrace



```
07-27 19:22:18.814: ERROR/ACRA(10002): de.uni_bremen.activities fatal error : Could not execute method of the activity
        java.lang.IllegalStateException: Could not execute method of the activity
        at android.view.View$1.onClick(View.java:3073)
        at android.view.View.performClick(View.java:3540)
        at android.view.View$PerformClick.run(View.java:14167)
        at android.os.Handler.handleCallback(Handler.java:605)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4558)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at android.view.View$1.onClick(View.java:3068)
        ... 11 more
        Caused by: java.lang.NullPointerException
        at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1720)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1593)
        at de.uni_bremen.network.networkServiceManagement.NetworkRequestListManager.addElement(NetworkRequestListManager.java:59)
        at de.uni_bremen.activities.LoginActivity.onLoginClicked(LoginActivity.java:106)
        ... 14 more
```


----------



## JavaMeister (27. Jul 2014)

> daran hat sich nichts geändert und auf einmal, gehts nicht mehr. Bei einer Operation, die schon tausend mal geklappt hat... ich schnalls echt nciht...



So ein Posting hatte ich schon mal heute. "Ich habe nix geändert". Das hilft leider nicht bei der Fehlersuche und ist zudem gelogen.


Was steht in Zeile:

SQLiteStatement.java:290

Maybe unterstützt die Datenbank kein Locking?


----------



## Goldfish (27. Jul 2014)

> So ein Posting hatte ich schon mal heute. "Ich habe nix geändert". Das hilft leider nicht bei der Fehlersuche und ist zudem gelogen.



Nein, gelogen war das nicht. Die Codestelle ist unverändert. Das einzige, was sich geändert hat, ist der Klassenname. Und das seh ich nicht als Änderung an, da er zumal auch ncihts mit der Tabelle in SQL zu tun hat der Name.

Wenn ich auf den Sourcecode für SQLiteStatement.java:290 gehe, öffnet mir der IDE eine Klasse, die gerade mal 160 Zeilen hat -_-
Und ja, die Sources sind vorhanden, falls dies die nächste Frage sein sollte ^^


----------



## Dagobert (28. Jul 2014)

Mit welcher IDE arbeitest du?
Hast du mal die App vom device deinstalliert... und dann komplett neu installiert?

lg. Dagobert


----------



## turtle (28. Jul 2014)

Ich habe keine Ahnung von Android, liest sich aber so, das die DB nicht offen ist?


----------



## Goldfish (28. Jul 2014)

ich arbeite mit IntelliJ. Und ja, die App einmal zu deinstallieren und neu aufzuspielen kam mir auch schon in den Sinn. Ich hab sogar schon mittels Subversion auf einen Stand zurückgesetzt, wo es noch funktionierte ursprünglich und der Fehler fliegt trotzdem noch X.X



> Ich habe keine Ahnung von Android, liest sich aber so, das die DB nicht offen ist?



Kann ich das irgendwie prüfen? bin gerade auf der Arbeit, daher kann ich das frühestens heute Abend prüfen, aber wäre gut zu wissen, wie ich das mache ^^


----------



## Dagobert (28. Jul 2014)

Ja du kannst das ganze in deinem Databasehelper loggen...
Wie sieht der denn aus?

lg. Dagobert


----------



## Goldfish (28. Jul 2014)

lol wtf?
Ich hab ne neue Klasse erzeugt, den Code, der mutmaßlich nicht funktionierte, in die neue Klasse kopiert, die Codestellen auf den neuen Klassennamen angepasst und es geht wieder -_-
Was fürn beknackter Mist ist das denn?


----------



## Dagobert (29. Jul 2014)

Deswegen entwickelt man Android ja in AS oder Eclipse 
Bis gerade wusste ich nicht mal das es nen Android Plugin für Netbeans gibt ^^

lg.


----------



## dzim (29. Jul 2014)

Manchmal hilft es (leider) ein "clean" auf das Projekt zu machen. Ich vermute, dass noch irgendwelche alten Klassen herumlagen und nicht richtig vom automatischen Build weggeputzt wurden.


----------



## Goldfish (29. Jul 2014)

> Deswegen entwickelt man Android ja in AS oder Eclipse
> Bis gerade wusste ich nicht mal das es nen Android Plugin für Netbeans gibt ^^



Ist mir auch neu, aber gut zu wissen, dass es eines für Netbeans gibt. Ich mach das ganze ja in IntelliJ und die Android-Unterstützung in IntelliJ ist wirklich grausig... Der einzige Grund, wieso ich das mit dem IDE mache ist, dass ich mit Eclipse nicht klar komme... habs tausend mal versucht und wollte jedes mal erneut Eclipse aus dem Fenster werfen, wäre das möglich gewesen ^^°



> Manchmal hilft es (leider) ein "clean" auf das Projekt zu machen. Ich vermute, dass noch irgendwelche alten Klassen herumlagen und nicht richtig vom automatischen Build weggeputzt wurden.



Sollte ich eigentlich wirklich beherzigen, denn mit maven und AspectJ hatte ich derartige Probleme auch nicht gerade selten...


----------



## dzim (29. Jul 2014)

Basiert AS (also Android Studio) nicht auf IntelliJ?

https://developer.android.com/sdk/installing/studio.html

Falls due es nicht schon tust, probier mal das, denn da sollte Android PERFEKT integriert sein. Ich bleibe erst mal noch bei Eclipse, denn das brauche ich noch für eine Reihe anderer Projekte.


----------



## Goldfish (29. Jul 2014)

So wie das aussieht, kann das gut sein, dass die IntelliJ Unterstützung darauf basiert. Sieht zumindest stark danach aus und ich hab gerade nicht die Energie mich da durchzulesen, da ich mit anderen Dingen beschäftigt bin ^^. 
Aber die Probleme die ich meine, sind folgende:


Die Syntax zeigt permanent Fehler an Stellen an, wo keine sind. Beduetet so viel, wie Syntaxfehler werden angezeigt, aber übersetzen und laufen tut alles wunderbar. Ist aber echt nervig, dass das ganze Projekt immer mit Fehlern angezeigt wird, weils angeblich Syntaxfehler gibt... Das ist schon seid Monaten so und trotz diverser Bugreports haben dies noch immer nicht behoben -_-
Wenn man ein großes Projekt hat und 2 Module des Projektes haben zufällig die gleiche Abhängigkeit von sagen wir bspw. commons-io. Dann wirft IntelliJ beim Übersetzen Fehler, weil die .jar-Datei 2 mal gefunden wurde... (okay kein direktes android Problem, aber saumäßig lästig...)


----------



## dzim (29. Jul 2014)

Sind es wirklich Fehler, oder ist es "nur" Androids LINT, das da meckert. So was gibt's mitunter auch in Eclipse... Und auch das mit den jars klingt vertraut (binde mal ein lib-Projekt ein, dass wie das Hauptprogramm die support-lib einbindet und die Versionen sind nicht identisch...).


----------



## Goldfish (29. Jul 2014)

nene, das sidn keine Fehler. Das ist wirklich nur das Syntax-Highlighting, dass da rumspinnt.
Also ich hatte es mal in Eclipse versucht einzubinden, das Projekt. Das war deutlich einfacher, weil Eclipse da nicht rumgeschriehen hat...
Aber aus dem Grund mach ich mittlerweile eigentlich auch schon alles mit maven, weil mir dieses rumgefrickel mit den jars zu lästig ist. Maven schafft da wirklich gute Abhilfe. Problem bei unserem Projekt ist nur, es wurde ursprünglich nicht als maven-Projekt angelegt und ich hab auch ehrlich gesagt zu wenig Plan vom Android-Bauvorgang, als dass ich das mal eben übersetzen könnte XD


----------



## dzim (29. Jul 2014)

Dazu setzt Android-Studio (wie übrigens auch OpenJDK/OpenJFX) fast nur noch auf Gradle. Glücklicherweise scheint es möglich zu sein, bei Gradle sowohl Maven-Dependencies, als auch Ant-Build-Tasks einzubinden. Darauf setzt Android bei Build. Muss man sich auch erst dran gewöhnen, allerdings hab ich damit unter Eclipse eigentlich dank dem ADT-Plugin nur in Ausnahmefällen etwas zu tun.


----------



## Dagobert (30. Jul 2014)

Jop Android mit Maven zu konfigurieren... war nich nett als ich es das letzte mal gemacht habe...

mit Gradle ist das sehr smooth und einfach wie ich finde 

lg. Dagobert


----------

