Java getWritableDatabase引发NullPointerException

Java getWritableDatabase引发NullPointerException,java,android,sqlite,nullpointerexception,Java,Android,Sqlite,Nullpointerexception,我遇到了一个问题,点击concreteIn按钮会导致应用程序崩溃 下面的代码来自于类别中的材料 package com.example.android.gatekeeper; import android.content.Intent; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.view

我遇到了一个问题,点击
concreteIn
按钮会导致应用程序崩溃

下面的代码来自于
类别中的
材料

package com.example.android.gatekeeper;

import android.content.Intent;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.example.android.gatekeeper.gateData.DbAccess;

import static com.example.android.gatekeeper.MaterialsOut.REQUEST_IMAGE_CAPTURE;


public class MaterialsIn extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_materials_in);

        // Find the (@Concrete) button.
        Button concreteIn = (Button) findViewById(R.id.concrete_in);

        // Set a click listener on that View
        concreteIn.setOnClickListener(new View.OnClickListener() {
            // The code in this method will be executed when the Concrete In button is clicked on.
            @Override
            public void onClick(View view) {
                DbAccess db = new DbAccess();
                db.insertConcreteIn();
                Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (takePicture.resolveActivity(getPackageManager()) != null) {
                    startActivityForResult(takePicture, REQUEST_IMAGE_CAPTURE);
                }
            }
        });
    }
}
调用
insertConcreteIn()
方法时,应用程序在
getWritableDatabase()
处崩溃

logcat如下所示:

03-19 19:58:08.190 24751-24751/com.example.android.gatekeeper E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.example.android.gatekeeper, PID: 24751
                                                                                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
                                                                                    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:283)
                                                                                    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
                                                                                    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
                                                                                    at com.example.android.gatekeeper.gateData.DbAccess.insertConcreteIn(DbAccess.java:20)
                                                                                    at com.example.android.gatekeeper.MaterialsIn$1.onClick(MaterialsIn.java:34)
                                                                                    at android.view.View.performClick(View.java:5702)
                                                                                    at android.widget.TextView.performClick(TextView.java:10888)
                                                                                    at android.view.View$PerformClick.run(View.java:22541)
                                                                                    at android.os.Handler.handleCallback(Handler.java:739)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                    at android.os.Looper.loop(Looper.java:158)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
03-19 19:58:08.190 3464-5216/? W/ActivityManager:   Force finishing activity com.example.android.gatekeeper/.MaterialsIn

这里的任何帮助都将不胜感激。

问题是您正在将无效的
上下文
传递给
SQLiteOpenHelper
构造函数。那是因为

DbAccess db = new DbAccess();

不要自己实例化
活动
类。这样的实例不适用于您希望活动用于的任何内容,例如用作
上下文


相反,将框架设置的有效
上下文
传递给需要它的方法。

代码中有一个bug。您需要修复它。如果需要帮助,请提供您的代码。此外,考虑阅读有关如何问好问题的文档。代码显示缺乏理解意图/活动在Android中的工作方式。从这里开始,我认为您应该考虑扩展DbAccess。第二个问题是
newdbhelper(this)
。(提示:您的活动名称应以
activity
结尾,即使您无法理解此混乱情况。)该活动未在构造函数中完全设置。每个以活动(或上下文)为参数的实例化都应该在
onCreate
@EugenPechanec中发生,通常是的,但在
SQLiteOpenHelper
的情况下,
上下文
仅在
get{Read,write}ableDatabase()
(不在构造函数中)时使用@iaito感谢您的回答。我还不太了解如何使用
上下文
,但我对编程相当陌生。在这种情况下,如何传入有效的
上下文
?如果无法从
MaterialsIn
实例化
DbAccess
,那么如何调用
insertConcreteIn()
方法?
DbAccess db = new DbAccess();
public class DbAccess extends AppCompatActivity