从另一个活动调用公共方法的NullPointerException

时间:2011-08-20 22:44:26

标签: android nullpointerexception

我有一个Activity SaveData.class,公共方法addEvent()用于在DataBase表中添加一些信息,如下所示:

public class SaveData extends Activity实现OnClickListener {

public SoftCopyDatabase dB ;
public static String FILE_NAME;
String _subject, _topic,_lecturenumber,_date;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.save);
    View add = findViewById(R.id.saveSave);
    add.setOnClickListener(this);
    View home = findViewById(R.id.saveBack);
    home.setOnClickListener(this);

}public void onStart() {
    super.onStart();
    dB = new SoftCopyDatabase(this);
}

public void onStop() {
    super.onStop();
    if (dB.getReadableDatabase().isOpen()) {
        //dB.close();
    }
}
public void onDestroy() {
    super.onDestroy();
    if (dB.getReadableDatabase().isOpen()) {
        dB.close();
    }
}

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.saveBack:
        Intent i = new Intent(this, OpenScreen.class);
        startActivity(i);
        break;
    case R.id.saveSave:

        EditText subject = (EditText) findViewById(R.id.subjectid);
        EditText topic = (EditText) findViewById(R.id.topicid);
        EditText lecturenumber = (EditText) findViewById(R.id.lecturenumberid);
        EditText date = (EditText) findViewById(R.id.dateid);
         _subject = ((TextView) subject).getText().toString();
         _topic = ((TextView) topic).getText().toString();
         _lecturenumber = ((TextView) lecturenumber).getText()
                .toString();
         _date = ((TextView) date).getText().toString();
        FILE_NAME = _subject + _topic + _lecturenumber;
        //addEvent();

        Intent j = new Intent(this, LectureNoting.class);
        startActivity(j);

        break;

    }
}

public void addEvent() {


    ContentValues values = new ContentValues();
    values.put(SUBJECT, _subject);
    values.put(TOPIC, _topic);
    values.put(LECTURENUMBER, _lecturenumber);
    values.put(DATE, _date);
    values.put(_DATA, FILE_NAME + ".png");
    dB.getWritableDatabase().insertOrThrow(TABLE_NAME, null, values);
}

}

另一个活动LectureNoting.class用于在磁盘上保存图纸并更新数据库表中的条目,如下所示:

public class LectureNoting extends Activity实现了View.OnTouchListener {

private SaveData sD=new SaveData();
private File directory = new File("/sdcard/SoftCopy"); 
//...remaining code
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.drawing_activity);
    }
//...remaining code
public void onClick(View view){
    switch (view.getId()){
case R.id.saveBtn:
addEvent();
            final Activity currentActivity  = this;
    Handler saveHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {

            Toast.makeText(currentActivity, "Lecture Saved",   Toast.LENGTH_SHORT).show();

        }
    } ;
   new ExportBitmapToFile(this,saveHandler, softCopyInterface.getBitmap()).execute();
        break;
//...remaining code
}
private class ExportBitmapToFile extends AsyncTask<Intent,Void,Boolean> {
    private Context mContext;
    private Handler mHandler;
    private Bitmap nBitmap;

    public ExportBitmapToFile(Context context,Handler handler,Bitmap bitmap) {
        mContext = context;
        nBitmap = bitmap;
        mHandler = handler;
    }

    @Override
    protected Boolean doInBackground(Intent... arg0) {

        try {
            if (!directory.exists()) {
                directory.mkdirs();
            }

            final FileOutputStream out = new FileOutputStream(new File(directory + "/"+SaveData.FILE_NAME+".png"));

            nBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();

            return true;
        }

        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return false;
    }


    @Override
    protected void onPostExecute(Boolean bool) {
        super.onPostExecute(bool);
        if ( bool ){
            mHandler.sendEmptyMessage(1);
        }
    }
 }
}

我收到以下错误:

       Unable to start activity componentInfo(com.ned.LectureNoting):NullPointerException

在addEvent()中,用于LectureNoting的onClick方法。

请告诉我哪里出错了。我想提一点的一点是,如果从定义它的同一个活动中调用addEvent(),则不会出现此错误。

1 个答案:

答案 0 :(得分:1)

一些事情:

  1. Logcat应该提供有关错误的更多信息。您可能需要向下滚动一下以查看代码中的问题来源,但应该有更多信息。
  2. 你不应该在扩展Activity的类中定义公共方法以供其他类使用。如果要将某些数据库方法公开给多个活动,则为其创建一个单独的类,然后在您的活动中调用该方法。您说LectureNoting延伸Activity。你确定吗?如果您只是这样调用SaveData,则必须延长addEvent()
  3. 无论哪种方式,都不要从另一个ACTIVITY内部调用方法。如果要将方法公开给多个活动,请在其自己的类中创建一个方法,该类具有与您公开的函数组相关的合理名称。