Java getWritableDatabase导致nullpointerexception

Java getWritableDatabase导致nullpointerexception,java,android,sql,database,Java,Android,Sql,Database,我正在使用存储特定信息的数据库进行一个项目。数据库对程序的一部分有效,但对其他部分无效。当用户第一次启动程序时,他们将看到从数据库中提取的信息,并且他们还可以选择添加新信息。db在这两个方面都可以正常工作 我遇到的问题是另一个添加信息的地方。当我打开数据库时,我的程序崩溃了。 日志: 新闻代码:27(第20-30行): DbM.java的代码:173(170-176) 我已经知道它和db的开放有一些关系,但为什么它会开放并为其他活动工作,而不是这个活动?我检查了这之前的所有活动,并关闭了所有数据

我正在使用存储特定信息的数据库进行一个项目。数据库对程序的一部分有效,但对其他部分无效。当用户第一次启动程序时,他们将看到从数据库中提取的信息,并且他们还可以选择添加新信息。db在这两个方面都可以正常工作

我遇到的问题是另一个添加信息的地方。当我打开数据库时,我的程序崩溃了。 日志:

新闻代码:27(第20-30行):

DbM.java的代码:173(170-176)

我已经知道它和db的开放有一些关系,但为什么它会开放并为其他活动工作,而不是这个活动?我检查了这之前的所有活动,并关闭了所有数据库

这是这个类的开始,DbM初始化是我为其他所有类所做的

public class NewStuff extends Activity {
Context context;
**DbM db=new DbM(this);**
有一件事是可能的,但不确定如何修复它,这是我在程序的其他部分使用的一类对象。所以我没有调用任何onCreate或类似的东西,这会导致我的问题吗

*编辑*

这是我的整个NewStuff类,除了上下文之外,我肯定错过了其他一些东西,因为似乎没有任何东西起作用

package peices;
import peices.DbM;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.app.Activity;
import android.content.Context;

public class NewStuff extends Activity {
Context context;
DbM db;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        db=new DbM(this);
        }
    public void CreateNewUnit(EditText Lat, EditText Lon, EditText UnitName, String SiteName)
    {

            db=new DbM(this);
            Log.d("NewUnit","Start of");
            String aa="";
            String bb="";
            String cc="";

            aa=Lat.getText().toString();
            bb=Lon.getText().toString();
            cc=UnitName.getText().toString();
            Log.d("Class",aa);
            Log.d("Class",bb);
            Log.d("Class",cc);
            Log.d("Class",SiteName);
            Log.d("Stuff","Before Open");
            db.open();
            Log.d("Stuff","Before Insert/After Open");
            db.InsertUnit(SiteName, cc, aa, bb);
            Log.d("Stuff","Before Close/After Insert");
            db.close();     
    }
编辑

调用NewStuff的onclick函数

ucreate.setOnClickListener(new OnClickListener(){
        public void onClick(View m){
            Log.d("Ubox","Unit Name: "+uname.getText().toString());
            Log.d("Ubox","Unit Longitude: "+ulon.getText().toString());
            Log.d("Ubox","Unit Latitude: "+ulat.getText().toString());
            Log.d("Ubox","Site Name: "+SiteName);
            NewStuff ns= new NewStuff();
            ns.CreateNewUnit(ulat,ulon,uname,SiteName);
            Intent I= new Intent(Site.this, Site.class);
            I.putExtra("SITE", SiteName);
            startActivity(I);

不能将DbM初始化为字段,因为上下文不会被初始化

 DbM db=new DbM(this);
召唤

仅在创建后或之后

编辑: 你不能打电话

NewStuff ns= new NewStuff()
这是因为如果您自己实例化,则不会设置活动的上下文。因此
this
内部新DbM(this)将没有任何意义

通常,您不应该从另一个活动中调用函数作为活动。

这样定义db

public class NewStuff extends Activity {
Context context;
DbM db;
然后再次创建(


这正是@nandeesh想告诉你的。

我的观点,但我没有遵循你的答案。当我尝试db=new DbM(这个);我现在得到一个VariableDeclaratorId,这意味着它找不到它的变量。我在这里遗漏了什么吗?你能展示一下Onclick函数吗?你正在用new call启动NewStuff类吗?我把调用NewStuff的Onclick函数放在了我原来的帖子中。好吧,我明白你现在说的了。不幸的是,我想要的做吧,就像你说的我不应该做的。我想做的可能更多的是在图书馆里,但我必须再看一看,以确定这是否真的是我想要的。好的,我理解你的建议。但是似乎没有任何效果。你的建议实际上甚至没有到达我的数据库,它使db.open为空指针。在过去的一个小时里,我一直在尝试各种各样的事情。所以我要用我的整个NewStuff类编辑我的第一篇文章,肯定是我做错了什么。是的,拥有完整的代码会有所帮助。也许你忘了在某个地方关闭数据库。我知道我在OnCreate之外有它们,但我使用这些函数来调用我再上一节课。也许我做错了。
 DbM db=new DbM(this);
 db=new DbM(this); 
NewStuff ns= new NewStuff()
public class NewStuff extends Activity {
Context context;
DbM db;
onCreate(){
........
   db=new DbM(this); 
}