安卓getWritableDatabase()抛出一个NullPointerException异常 [英] Android getWritableDatabase() throws a NullPointerException

查看:1189
本文介绍了安卓getWritableDatabase()抛出一个NullPointerException异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法用我的电话给getWritableDatabase()。它返回一个NullPointerException异常。这是奇怪的事情是,这个错误才开始发生后,我注释掉code两线在我的Andr​​oid清单。现在,该项目是回到它是(我取消注释的部分,它仍然抛出一个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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆