安卓getWritableDatabase()抛出一个NullPointerException异常 [英] Android getWritableDatabase() throws a NullPointerException
问题描述
我无法用我的电话给getWritableDatabase()。它返回一个NullPointerException异常。这是奇怪的事情是,这个错误才开始发生后,我注释掉code两线在我的Android清单。现在,该项目是回到它是(我取消注释的部分,它仍然抛出一个NullPointerException异常)。所以,我检查了我的情况下,试图this.getBaseContext()和this.getApplicationContext()。
使用getApplicationContext()提出了这一点,以logcat的:
九月8日至12日:24:20.042:E / AndroidRuntime(5572):致命异常:主要
9月八日至12日:24:20.042:E / AndroidRuntime(5572):java.lang.RuntimeException的:无法实例化服务com.productivity.uptimeapp.NetService:显示java.lang.NullPointerException
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2395)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.app.ActivityThread.access $ 1600(ActivityThread.java:139)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1313)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.os.Handler.dispatchMessage(Handler.java:99)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.os.Looper.loop(Looper.java:137)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.app.ActivityThread.main(ActivityThread.java:5021)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在java.lang.reflect.Method.invokeNative(本机方法)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在java.lang.reflect.Method.invoke(Method.java:511)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:789)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在dalvik.system.NativeStart.main(本机方法)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):由:显示java.lang.NullPointerException
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在com.productivity.uptimeapp.NetService< INIT>(NetService.java:45)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在java.lang.Class.newInstanceImpl(本机方法)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在java.lang.Class.newInstance(Class.java:1319)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2392)
9月八日至12日:24:20.042:E / AndroidRuntime(5572):10 ...更多
使用getBaseContext()提出了这一点,以logcat的:
九月8日至12日:28:57.058:E / AndroidRuntime(5833):致命异常:主要
9月八日至12日:28:57.058:E / AndroidRuntime(5833):java.lang.RuntimeException的:无法实例化服务com.productivity.uptimeapp.NetService:显示java.lang.NullPointerException
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2395)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.app.ActivityThread.access $ 1600(ActivityThread.java:139)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1313)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.os.Handler.dispatchMessage(Handler.java:99)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.os.Looper.loop(Looper.java:137)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.app.ActivityThread.main(ActivityThread.java:5021)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在java.lang.reflect.Method.invokeNative(本机方法)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在java.lang.reflect.Method.invoke(Method.java:511)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:789)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在dalvik.system.NativeStart.main(本机方法)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):由:显示java.lang.NullPointerException
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在com.productivity.uptimeapp.NetService< INIT>(NetService.java:46)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在java.lang.Class.newInstanceImpl(本机方法)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在java.lang.Class.newInstance(Class.java:1319)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2392)
9月八日至12日:28:57.058:E / AndroidRuntime(5833):10 ...更多
下面是我的相关NetService code。它从我的第一个活动叫做:
包com.productivity.uptimeapp;
进口java.io.BufferedReader中;
进口java.io.DataOutputStream中;
进口java.io.IOException异常;
进口java.io.InputStreamReader中;
进口的java.io.PrintWriter;
进口java.net.ServerSocket的;
进口的java.net.Socket;
进口java.net.SocketException异常;
进口java.util.Iterator的;
进口org.json.JSONException;
进口org.json.JSONObject;
进口org.json.JSONTokener;
进口android.app.Service;
进口android.content.Intent;
进口android.database.SQLException;
进口android.database.sqlite.SQLiteDatabase;
进口android.os.AsyncTask;
进口android.os.Binder;
进口android.os.IBinder;
进口android.util.Log;
公共类NetService延伸服务{
私有静态最后字符串变量= NetService.class.getSimpleName();
//变量ServerGet
ServerSocket的ServerSocket的;
私有静态插座ClientSocket的;
//服务器端口
私有静态最终诠释端口= 8888;
私有静态InputStreamReader的isReader;
私有静态DataOutputStream类之处;
私有静态PrintWriter的PrintWriter的;
私有静态的BufferedReader面包屑;
私人字符串乱;
//...end ServerGet变量
ServerGet myFeed;
客户端了;
DbHelper dbHelper =新DbHelper(this.getBaseContext());
SQLiteDatabase DB = dbHelper.getWritableDatabase();
私人最终的IBinder的IBinder =新LocalBinder();
公共类LocalBinder扩展粘合剂{
公共NetService的getService(){
//返回本地服务的这个实例,以便客户端可以调用的公共方法
返回NetService.this;
}
}
@覆盖
公众的IBinder onBind(意向为arg0){
//创建新的AsyncTask
myFeed =新ServerGet();
//开始新的AsyncTask
myFeed.execute();
返回的IBinder;
}
// ServerGet类异步获取新的字符串
私有类ServerGet扩展的AsyncTask<太虚,字符串,整数> {
//这个包含我的服务器,该服务器从客户端得到消息,并相应地作出响应
}
}
这是我注释掉在我的清单中的行只会让我为默认主屏,这样我可以更改某些设置。通常情况下,我想这个应用程序以取代HOME因此android.intent.category.HOME属性。我怀疑这是问题,但注释掉那些三线是什么触发它。
<应用
机器人:allowBackup =真
机器人:图标=@可绘制/ ic_launcher
机器人:标签=@字符串/ APP_NAME
机器人:主题=@风格/全屏>
<服务机器人:名称=NetService/>
<活动
机器人:名称=com.productivity.uptimeapp.Login
机器人:标签=@字符串/ APP_NAME
机器人:screenOrientation =景观与GT;
<意向滤光器>
<作用机器人:名称=android.intent.action.MAIN/>
!< - <类机器人:名称=android.intent.category.DEFAULT/> - >
!< - <类机器人:名称=android.intent.category.LAUNCHER/> - >
!< - <类机器人:名称=android.intent.category.HOME/> - >
&所述; /意图滤光器>
< /活性GT;
...
我张贴的唯一原因是因为没有其他的解决方案,我已经找到工作。我希望我只是缺少事先简单的东西...谢谢!
编辑:我已经找到了解决办法这是实例数据库之前,我每次(在我的AsyncTask方法作为参数传递)的说法。这是因为我不能有dbHelper和DB的同时访问数据库。这是一个没有脑子,但现在我有一堆实例数据库变量,我想只有一个接近顶部的。我可以做这项工作?
com.productivity.uptimeapp.NetService< INIT>(NetService.java:45)
这行的logcat的建议有一个问题实例类(< INIT>
)。
在code,有以下成员变量的初始化:
DbHelper dbHelper =新DbHelper(this.getBaseContext());
SQLiteDatabase DB = dbHelper.getWritableDatabase();
这个问题是存在的。你不能使用类实例作为上下文
直到的onCreate()
。推迟你的 dbHelper
和分贝
初始化的onCreate()
或更高版本。
I am having trouble with my call to getWritableDatabase(). It is returning a NullPointerException. The thing that is strangest is that this error only began occurring after I commented out a couple lines of code in my android manifest. Now the project is back to where it was (I un-commented those sections and it still throws a NullPointerException). So I checked my context and tried this.getBaseContext() and this.getApplicationContext().
Using getApplicationContext() puts this out to logcat:
08-12 09:24:20.042: E/AndroidRuntime(5572): FATAL EXCEPTION: main
08-12 09:24:20.042: E/AndroidRuntime(5572): java.lang.RuntimeException: Unable to instantiate service com.productivity.uptimeapp.NetService: java.lang.NullPointerException
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2395)
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.app.ActivityThread.access$1600(ActivityThread.java:139)
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.os.Handler.dispatchMessage(Handler.java:99)
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.os.Looper.loop(Looper.java:137)
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.app.ActivityThread.main(ActivityThread.java:5021)
08-12 09:24:20.042: E/AndroidRuntime(5572): at java.lang.reflect.Method.invokeNative(Native Method)
08-12 09:24:20.042: E/AndroidRuntime(5572): at java.lang.reflect.Method.invoke(Method.java:511)
08-12 09:24:20.042: E/AndroidRuntime(5572): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
08-12 09:24:20.042: E/AndroidRuntime(5572): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
08-12 09:24:20.042: E/AndroidRuntime(5572): at dalvik.system.NativeStart.main(Native Method)
08-12 09:24:20.042: E/AndroidRuntime(5572): Caused by: java.lang.NullPointerException
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
08-12 09:24:20.042: E/AndroidRuntime(5572): at com.productivity.uptimeapp.NetService.<init>(NetService.java:45)
08-12 09:24:20.042: E/AndroidRuntime(5572): at java.lang.Class.newInstanceImpl(Native Method)
08-12 09:24:20.042: E/AndroidRuntime(5572): at java.lang.Class.newInstance(Class.java:1319)
08-12 09:24:20.042: E/AndroidRuntime(5572): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2392)
08-12 09:24:20.042: E/AndroidRuntime(5572): ... 10 more
Using getBaseContext() puts this out to logcat:
08-12 09:28:57.058: E/AndroidRuntime(5833): FATAL EXCEPTION: main
08-12 09:28:57.058: E/AndroidRuntime(5833): java.lang.RuntimeException: Unable to instantiate service com.productivity.uptimeapp.NetService: java.lang.NullPointerException
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2395)
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.app.ActivityThread.access$1600(ActivityThread.java:139)
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.os.Handler.dispatchMessage(Handler.java:99)
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.os.Looper.loop(Looper.java:137)
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.app.ActivityThread.main(ActivityThread.java:5021)
08-12 09:28:57.058: E/AndroidRuntime(5833): at java.lang.reflect.Method.invokeNative(Native Method)
08-12 09:28:57.058: E/AndroidRuntime(5833): at java.lang.reflect.Method.invoke(Method.java:511)
08-12 09:28:57.058: E/AndroidRuntime(5833): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
08-12 09:28:57.058: E/AndroidRuntime(5833): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
08-12 09:28:57.058: E/AndroidRuntime(5833): at dalvik.system.NativeStart.main(Native Method)
08-12 09:28:57.058: E/AndroidRuntime(5833): Caused by: java.lang.NullPointerException
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
08-12 09:28:57.058: E/AndroidRuntime(5833): at com.productivity.uptimeapp.NetService.<init>(NetService.java:46)
08-12 09:28:57.058: E/AndroidRuntime(5833): at java.lang.Class.newInstanceImpl(Native Method)
08-12 09:28:57.058: E/AndroidRuntime(5833): at java.lang.Class.newInstance(Class.java:1319)
08-12 09:28:57.058: E/AndroidRuntime(5833): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2392)
08-12 09:28:57.058: E/AndroidRuntime(5833): ... 10 more
Here is my relevant NetService Code. It's called from my first Activity:
package com.productivity.uptimeapp;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Iterator;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import android.app.Service;
import android.content.Intent;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class NetService extends Service{
private static final String TAG = NetService.class.getSimpleName();
//variables for ServerGet
ServerSocket serverSocket;
private static Socket clientSocket;
//server port
private static final int PORT = 8888;
private static InputStreamReader isReader;
private static DataOutputStream dos;
private static PrintWriter printWriter;
private static BufferedReader bReader;
private String mess;
//...end ServerGet variables
ServerGet myFeed;
Client out;
DbHelper dbHelper = new DbHelper(this.getBaseContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
private final IBinder iBinder = new LocalBinder();
public class LocalBinder extends Binder {
public NetService getService() {
// Return this instance of LocalService so clients can call public methods
return NetService.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
//creates new AsyncTask
myFeed = new ServerGet();
//starts new AsyncTask
myFeed.execute();
return iBinder;
}
//ServerGet class asynchronously gets new strings
private class ServerGet extends AsyncTask <Void, String, Integer>{
//This contains my Server which gets messages from a client and responds accordingly
}
}
The lines that I commented out in my Manifest only served to get me to the default home screen so I could change some settings. Normally, I would want this app to replace HOME thus the android.intent.category.HOME attribute. I am doubtful that this is the problem but commenting out those three lines is what triggered it.
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/fullscreen">
<service android:name="NetService" />
<activity
android:name="com.productivity.uptimeapp.Login"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- <category android:name="android.intent.category.DEFAULT" /> -->
<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
<!-- <category android:name="android.intent.category.HOME"/> -->
</intent-filter>
</activity>
...
The only reason I'm posting is because none of the other solutions I have found are working. I hope I'm just missing something simple... Thanks in advance!
EDIT: I have found a solution which was to instantiate db before I called it each time (passed as an argument in my AsyncTask methods). This is because I can not have dbHelper and db accessing the database at the same time. This was a no-brainer but now I have a bunch of instantiated db variables where I'd like to only have one near the top. Can I make that work?
com.productivity.uptimeapp.NetService.<init>(NetService.java:45)
This line in the logcat suggests there's a problem instantiating your class (<init>
).
In the code, there's the following member variable initialization:
DbHelper dbHelper = new DbHelper(this.getBaseContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
The problem is there. You cannot use the class instance as Context
until onCreate()
. Defer your dbHelper
and db
initialization to onCreate()
or later.
这篇关于安卓getWritableDatabase()抛出一个NullPointerException异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!